Middle
Can I implement an enhanced for-each loop for my object?
sobes.tech AI
Answer from AI
Yes, you can. For this, your object must implement the Iterable interface.
The Iterable interface contains a single method iterator(), which must return an object implementing the Iterator interface.
The Iterator interface has two main methods:
hasNext(): Returns true if there are more elements to iterate over.next(): Returns the next element in the iteration.
Optionally, Iterator can contain a remove() method to delete the current element.
Example implementation:
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> { // Inner class for 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++);
}
// Optional method for removing an element
@Override
public void remove() {
if (currentIndex <= 0) {
throw new IllegalStateException();
}
elements.remove(currentIndex - 1);
currentIndex--; // Remember to adjust index after removal
}
}
}
class Main {
public static void main(String[] args) {
MyCollection<String> collection = new MyCollection<>();
collection.add("Element 1");
collection.add("Element 2");
collection.add("Element 3");
// Using enhanced for-each loop
for (String element : collection) {
System.out.println(element);
}
// Example of using the iterator directly with removal
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if ("Element 2".equals(element)) {
iterator.remove();
}
}
System.out.println("\nAfter removal:");
for (String element : collection) {
System.out.println(element);
}
}
}
After implementing Iterable, your object can be used in for (ElementType element : yourObject) { ... } constructs.