Java. Розширений цикл for в стилі for each. Загальна форма. Приклади. Обробка масивів, колекцій об’єктів ArrayList, LinkedList

Розширений цикл for в стилі for each. Загальна форма. Приклади. Обробка масивів, колекцій об’єктів ArrayList, LinkedList


Зміст


1. Призначення, загальна форма та принцип роботи розширеного циклу for

У програмах на Java дуже часто потрібно реалізовувати обробку масивів, колекцій, наборів даних. Найбільш поширеною операцією при обробці масивів даних є перебір кожного елементу масиву. Для забезпечення перебору використовується один з відомих операторів циклу (for, while, do…while). Найчастіше для перебору елементів масиву використовується цикл for.

Оскільки, перебір елементів масиву є стандартною операцією, то розробники Java ввели додатковий формат циклу for, який забезпечує більш спрощену, раціональну його реалізацію. У цій реалізації загальна форма циклу for подібна до форми циклу foreach в інших мовах програмування.

Загальна форма розширеного циклу for наступна:

for (type variable : collection) {
    // деякі оператори
    // ...
}

де

  • type – тип внутрішньої змінної з іменем variable;
  • variable – внутрішня змінна типу type. Ця змінна має видимість в межах блоку фігурних дужок { }. Ця змінна є ітераційною, вона зберігає елементи набору даних collection;
  • collection – набір даних, які по-черзі перебираються в циклі. Набором даних може служити колекція чи масив.

Розширений цикл for працює наступним чином. У розширеному циклі for відбувається послідовний перебір усіх елементів колекції чи масиву. Кількість ітерацій циклу рівна кількості елементів у колекції чи масиві. На кожній ітерації значення елементу масиву поміщається в ітераційну змінну variable, яку можна обробляти на власний розсуд. Цикл гарантує проходження усієї колекції (масиву) від першого елементу до останнього.

 

2. Приклади обробки масивів розширеним циклом for

2.1. Приклад. Обробка масиву чисел типу int (примітивний тип даних).

У прикладі демонструється використання розширеного циклу for для обробки одновимірного цілочисельного масиву A. Реалізовано підрахунок кількості парних чисел масиву.

// ініціалізація одновимірного масиву A
int[] A = { 1, 8, 3, 6, 5, 10, 31 , 24, 10, 13, 2, 4 };          
int k = 0; // кількість парних чисел
// розширений цикл for
for (int d : A)
    if (d % 2 == 0)
        k++; // k = 7

 


 

2.2. Приклад. Обробка масиву обʼєктів типу Book (книга)

Нехай задано клас Book, що реалізує книгу

// клас, що реалізує книгу
class Book {
    String title; // назва книги
    String author; // ім'я автора
    float price; // ціна
    int year; // рік видання
}

Використання розширеного циклу for для масиву типу Book може бути, наприклад, таким:

// оголошення одновимірного масиву типу Book
Book B[];

// виділити пам'ять для масиву з 4 посилань на тип Book
B = new Book[4];

// видідити пам'ять для кожного елементу масиву типу Book
for (int i=0; i<B.length; i++)
    B[i] = new Book();

// заповнити масив значеннями
B[0].title = "Book-1";
B[0].author = "Author-1";
B[0].price = 205.78f;
B[0].year = 2008;

B[1].title = "Book-2";
B[1].author = "Author-2";
B[1].price = 99.00f;
B[1].year = 2010;

B[2].title = "Book-3";
B[2].author = "Author-3";
B[2].price = 0.99f;
B[2].year = 2011;

B[3].title = "Book-4";
B[3].author = "Author-4";
B[3].price = 100.01f;
B[3].year = 2012;

// розширений цикл for
// пошук книг 2011, 2012 років       
for (Book book : B)
    if ((book.year==2011)||(book.year==2012))
        System.out.println("Book: " + book.title + ", " + book.author);

У результаті виконання вищенаведеного коду буде виведено такі рядки:

Book: Book-3, Author-3
Book: Book-4, Author-4

 

3. Приклади обробки колекцій розширеним циклом for

3.1. Приклад. Обробка колекції типу Integer з допомогою динамічного масиву ArrayList

У прикладі демонструється обробка колекції цілих чисел з допомогою класів ArrayList та Integer.

Клас ArrayList реалізує динамічний масив, який може збільшуватись або зменшуватись в міру необхідності. Щоб використовувати даний клас потрібно підключити пакет java.util. Оголошення класу ArrayList наступне:

class ArrayList<E>

де

  • E – тип об’єктів, які зберігаються в масиві.

Клас Integer є класом-обгорткою над типом int, що представляє собою цілочисельні значення. У даному прикладі клас ArrayList для обробки об’єктів типу Integer має вигляд:

class ArrayList<Integer>

Демонстрація використання розширеного циклу for для колекції цілих чисел з допомогою класу ArrayList показана нижче

// підключити пакет java.util
import java.util.*;

...

// клас ArrayList, об'єкт типу колекція Integer
// Integer - клас-обгортка для типу int
ArrayList<Integer> A = new ArrayList<Integer>(); // створити колекцію

// занести елементи в колекцію
A.add(5);
A.add(9);
A.add(-20);
A.add(11);
A.add(7); // A = { 5, 9, -20, 11, 7 }

// знайти суму елементів колекції
int sum = 0;
for (Integer i : A) // розширений цикл for
    sum += i;

System.out.println("Sum = " + sum); // Sum = 12

 

3.2. Обробка колекції типу Book з допомогою зв’язного списку LinkedList

Клас (тип) Book має наступне оголошення:

// клас, що реалізує книгу
class Book {
    String title; // назва книги
    String author; // ім'я автора
    float price; // ціна
    int year; // рік видання
}

У даному прикладі для демонстрації розширеного циклу for використовується клас LinkedList. Цей клас призначений для організації даних заданого типу в зв’язний список. Щоб використати клас LinkedList у програмі потрібно підключити пакет java.util. Оголошення класу має вигляд:

class LinkedList<E>

де

  • E – тип об’єктів, що зберігаються у списку. У нашому випадку цим типом є клас Book.

Програмний код, який формує список книг типу Book і обробляє його в розширеному циклі for (пошук заданої книги) має вигляд:

// підключити пакет java.util
import java.util.*;

...

// оголосити та створити об'єкт типу LinkedList<Book>
LinkedList<Book> LB = new LinkedList<Book>();
Book B = new Book(); // додаткова змінна

// сформувати список об'єктів LinkedList<Book>

// сформувати об'єкт типу Book
B.title = "Title-1";
B.author = "Author-1";
B.price = 10.00f;
B.year = 2000;

// додати об'єкт B у список
LB.add(B);

// додати другий об'єкт
B = new Book(); // виділити пам'ять
B.title = "Title-2";
B.author = "Author-2";
B.price = 20.00f;
B.year = 2001;
LB.add(B);

// додати третій об'єкт
B = new Book(); // виділити пам'ять
B.title = "Title-3";
B.author = "Author-3";
B.price = 30.00f;
B.year = 2002;
LB.add(B);

// вивести список LB
int i=0;
for (Book B2 : LB) {
    i++;
    System.out.println("Book - " + i + ": " + B2.title + ", " + B2.author);
}

System.out.println("-----------------------------------");

// вивести книги 2001 року випуску                       
for (Book B2 : LB)
    if (B2.year == 2001)
        System.out.println(B2.title + ", " + B2.author + ", " + B2.year);

У вищенаведеному коді в рядках

int i=0;
for (Book B2 : LB) {
    i++;
    System.out.println("Book - " + i + ": " + B2.title + ", " + B2.author);
}

номер позиції у зв’язному списку Book обчислюється шляхом введення додаткової змінної i. Бувають випадки, коли потрібно обробляти не всі елементи колекції. За значенням ітератора i можна визначати номер позиції об’єкту колекції, який має бути оброблений.

Після виконання вищенаведеного коду на екран буде виведено:

Book - 1: Title-1, Author-1
Book - 2: Title-2, Author-2
Book - 3: Title-3, Author-3
-----------------------------------
Title-2, Author-2, 2001

 

4. Які переваги та недоліки застосування розширеного циклу for для масивів

Розширений цикл for є зручним для обробки колекцій. Використання розширеного циклу for дає наступні переваги:

  • спрощеність та раціональність представлення у порівнянні з циклом for;
  • не потрібно використовувати додаткову змінну циклу, задавати її початкове значення та умову завершення циклу;
  • не потрібно індексувати масив.

Основний недолік розширеного циклу for:

  • відсутність “гнучкості” в оперуванні ітераційною змінною у випадках, коли потрібно здійснювати перебір не всіх елементів колекції. Наприклад, коли потрібно перебирати тільки перші n елементів усієї колекції або елементи, які лежать на певних позиціях (парних позиціях, непарних позиціях) в колекції. Однак, цей недолік можна обійти введенням додаткових змінних-ітераторів та перевірки умов.

 


Зв’язані теми