Перебор элементов — одна из самых частых задач при работе с коллекциями. В Java есть два основных способа сделать это:
- Цикл for-each:
for (Type item : collection). Это самый краткий и удобный способ для чтения данных. - Iterator: объект, который позволяет обходить коллекцию шаг за шагом с помощью методов
hasNext()иnext(). Главное преимущество итератора — возможность безопасно удалять элементы во время перебора методомremove().
В этом уроке мы разберем синтаксис обоих подходов, научимся избегать ошибок ConcurrentModificationException и выбирать правильный инструмент для задачи.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Синтаксис for-each
Дан фрагмент кода на Java, который создаёт список чисел и должен вывести каждый элемент с помощью цикла for-each. Однако в синтаксисе цикла пропущен обязательный символ. Вставьте недостающий символ в отмеченное место, чтобы код стал корректным и вывел все числа списка. Обратите внимание на синтаксис цикла for-each для коллекций в Java.
import java.util.List;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
for (Integer num input1S numbers) {
System.out.println(num);
}
}
}2. Методы Iterator
В левой колонке перечислены названия методов интерфейса Iterator, а в правой — их краткие описания. Сопоставьте каждый метод с соответствующим действием, которое он выполняет при работе с коллекциями. Обратите внимание, что в правой колонке описания представлены в случайном порядке.
next()hasNext()remove()3. Цикл while с итератором
В данном задании представлен фрагмент кода, демонстрирующий перебор элементов коллекции с использованием итератора. Вам необходимо заполнить пропуски, выбрав подходящие методы из предложенного списка, чтобы цикл while корректно перебрал все элементы списка и вывел их на экран. Обратите внимание на порядок использования методов итератора: один проверяет наличие следующего элемента, другой — получает текущий элемент и перемещает итератор вперёд.
import java.util.*;
public class IteratorExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
Iterator<String> it = fruits.iterator();
while (it.input1S()) {
String fruit = it.input2S();
System.out.println(fruit);
}
}
}4. Удаление в for-each
Проанализируйте представленный фрагмент кода на Java. Внимательно изучите, что происходит при попытке удаления элемента из коллекции непосредственно внутри цикла for-each. На основе анализа поведения программы выберите единственный верный вариант результата её выполнения.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
for (String s : list) {
if (s.equals("B")) {
list.remove(s);
}
}
System.out.println(list);
}
}5. Алгоритм работы итератора
Перед вами строки java-кода, демонстрирующие базовый алгоритм работы итератора для перебора коллекции. Строки перемешаны. Расставьте их в правильном порядке, чтобы получился корректный фрагмент программы, который создаёт коллекцию, получает итератор, и в цикле while выводит все её элементы. Обратите внимание на последовательность: сначала создание коллекции и добавление элементов, затем получение итератора, начало цикла while с проверкой hasNext(), получение элемента через next() и его вывод.
while (it.hasNext()) {list.add("Java");list.add("Iterator");} System.out.println(element);Iterator<String> it = list.iterator();List<String> list = new ArrayList<>(); String element = it.next();6. Составляющие цикла
Перед вами фрагмент кода на Java, содержащий цикл for-each. Внимательно изучите его. Ваша задача — отметить три ключевых составляющих этого цикла: тип переменной-итератора, имя этой переменной и коллекцию (или массив), по которой происходит итерация. Не отмечайте ключевые слова языка (например, for), операторы (например, двоеточие) или элементы тела цикла.
{{for~|~t0}} ({{String~|~t1}} {{word~|~t2}} : {{wordsList~|~t3}}) {
System.out.println({{word~|~t4}});
}7. Типы перебора
В данном задании представлены два фрагмента кода на Java, демонстрирующие разные способы перебора коллекции. Ваша задача — разметить каждый из выделенных блоков кода, указав, является ли он циклом for-each или циклом с использованием Iterator. Обратите внимание на синтаксические особенности каждого подхода.
// Пример 1
{{for (String item : list) {
System.out.println(item);
}~|~t1}}
// Пример 2
{{Iterator it = list.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
}~|~t2}} 8. Безопасное удаление
Из предложенных строк соберите корректную java-программу, которая создаёт список строк, а затем с помощью Iterator удаляет из него все строки длиннее 5 символов, используя метод remove(). Программа должна содержать объявление класса, метода main, создание списка, получение итератора, цикл while с проверкой условия и удаление. Лишние строки (например, использование for-each или неправильные вызовы) в решение включать не нужно.
import java.util.*;public class Main { public static void main(String[] args) { List<String> words = new ArrayList<>(Arrays.asList("hello", "world", "programming", "java")); Iterator<String> iterator = words.iterator(); while (iterator.hasNext()) { String word = iterator.next(); if (word.length() > 5) { iterator.remove(); } } System.out.println(words); }} for (String word : words) { if (word.length() > 5) { words.remove(word); } } words.removeIf(word -> word.length() > 5);