Перебор коллекций (Iterators vs for-each)

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Перебор элементов — одна из самых частых задач при работе с коллекциями. В Java есть два основных способа сделать это:

  1. Цикл for-each: for (Type item : collection). Это самый краткий и удобный способ для чтения данных.
  2. Iterator: объект, который позволяет обходить коллекцию шаг за шагом с помощью методов hasNext() и next(). Главное преимущество итератора — возможность безопасно удалять элементы во время перебора методом remove().

В этом уроке мы разберем синтаксис обоих подходов, научимся избегать ошибок ConcurrentModificationException и выбирать правильный инструмент для задачи.

Список тем

1. Синтаксис for-each

id: 40513_iter_01_foreach_syntax

Дан фрагмент кода на 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);
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Методы Iterator

id: 40513_iter_02_iterator_methods

В левой колонке перечислены названия методов интерфейса Iterator, а в правой — их краткие описания. Сопоставьте каждый метод с соответствующим действием, которое он выполняет при работе с коллекциями. Обратите внимание, что в правой колонке описания представлены в случайном порядке.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
next()
hasNext()
remove()
Возвращает следующий элемент коллекции
Удаляет текущий элемент из коллекции
Проверяет, есть ли следующий элемент в коллекции
Сообщения
Проверить
Показать подсказку

3. Цикл while с итератором

id: 40513_iter_03_while_loop

В данном задании представлен фрагмент кода, демонстрирующий перебор элементов коллекции с использованием итератора. Вам необходимо заполнить пропуски, выбрав подходящие методы из предложенного списка, чтобы цикл 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);
        }
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Удаление в for-each

id: 40513_iter_04_safety

Проанализируйте представленный фрагмент кода на 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. Алгоритм работы итератора

id: 40513_iter_05_sequence

Перед вами строки 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. Составляющие цикла

id: 40513_iter_06_click_parts

Перед вами фрагмент кода на Java, содержащий цикл for-each. Внимательно изучите его. Ваша задача — отметить три ключевых составляющих этого цикла: тип переменной-итератора, имя этой переменной и коллекцию (или массив), по которой происходит итерация. Не отмечайте ключевые слова языка (например, for), операторы (например, двоеточие) или элементы тела цикла.

Кликните по всем фрагментам, которые подходят под условие задания.
{{for~|~t0}} ({{String~|~t1}} {{word~|~t2}} : {{wordsList~|~t3}}) {
    System.out.println({{word~|~t4}});
}
Сообщения
Проверить
Показать подсказку

7. Типы перебора

id: 40513_iter_07_highlight

В данном задании представлены два фрагмента кода на 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}}
for-each цикл
Iterator цикл
Сообщения
Проверить
Показать подсказку

8. Безопасное удаление

id: 40513_iter_08_build_remove

Из предложенных строк соберите корректную 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);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру