Sobes.tech
Middle

Kas ma saan oma objekti jaoks täiustatud for-each tsükli rakendada?

sobes.tech AI

Vastus AI-lt

Да, можете. Для этого ваш объект должен реализовывать интерфейс 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) { ... }.