Розширений цикл for в стилі for each. Загальна форма. Приклади. Обробка масивів, колекцій об’єктів ArrayList, LinkedList
Зміст
- 1. Призначення, загальна форма та принцип роботи розширеного циклу for
- 2. Приклади обробки масивів розширеним циклом for
- 3. Приклади обробки колекцій розширеним циклом for
- 4. Які переваги та недоліки застосування розширеного циклу for для масивів
- Зв’язані теми
Пошук на інших ресурсах:
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 елементів усієї колекції або елементи, які лежать на певних позиціях (парних позиціях, непарних позиціях) в колекції. Однак, цей недолік можна обійти введенням додаткових змінних-ітераторів та перевірки умов.
⇑
Зв’язані теми
- Цикли for, while, do..while. Приклади використання
- Розв’язки задач з використанням циклів
- Одновимірні масиви