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) { ... }.