Sobes.tech
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.