Назад к вопросам
Middle
70
questionbank

Могу ли я реализовать улучшенный цикл for-each для своего объекта?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Да, можете. Для этого ваш объект должен реализовывать интерфейс Iterable.

Интерфейс Iterable содержит единственный метод iterator(), который должен возвращать объект, реализующий интерфейс Iterator.

Интерфейс Iterator содержит два основных метода:

  • hasNext(): Возвращает true, если имеются еще элементы для итерации.
  • next(): Возвращает следующий элемент в итерации.

Опционально Iterator может содержать метод remove() для удаления текущего элемента.

Пример реализации:

import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;

class MyCollection<T> implements Iterable<T> {

    private List<T> elements = new ArrayList<>();

    public void add(T element) {
        elements.add(element);
    }

    @Override
    public Iterator<T> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<T> { // Внутренний класс для Iterator
        private int currentIndex = 0;

        @Override
        public boolean hasNext() {
            return currentIndex < elements.size();
        }

        @Override
        public T next() {
            if (!hasNext()) {
                throw new java.util.NoSuchElementException();
            }
            return elements.get(currentIndex++);
        }

        // Опциональный метод для удаления элемента
        @Override
        public void remove() {
            if (currentIndex <= 0) {
                throw new IllegalStateException();
            }
            elements.remove(currentIndex - 1);
            currentIndex--; // Не забываем сместить индекс после удаления
        }
    }
}

class Main {
    public static void main(String[] args) {
        MyCollection<String> collection = new MyCollection<>();
        collection.add("Элемент 1");
        collection.add("Элемент 2");
        collection.add("Элемент 3");

        // Использование улучшенного цикла for-each
        for (String element : collection) {
            System.out.println(element);
        }

        // Пример использования итератора напрямую с удалением
        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            if ("Элемент 2".equals(element)) {
                iterator.remove();
            }
        }

        System.out.println("\nПосле удаления:");
        for (String element : collection) {
            System.out.println(element);
        }
    }
}

После реализации Iterable, ваш объект сможет быть использован в конструкциях for (ElementType element : yourObject) { ... }.