创建自己的 Iterable 结构,以便与 Iterator 或 for-each 循环一起使用

为了确保我们的集合可以使用迭代器或 for-each 循环进行迭代,我们必须遵循以下步骤:

  1. 我们想要迭代的东西必须是 Iterable 并暴露 iterator()
  2. 通过覆盖 hasNext()next()remove() 设计一个 java.util.Iterator

我在下面添加了一个简单的通用链表实现,它使用上面的实体来使链表可迭代。

package org.algorithms.linkedlist;
 
import java.util.Iterator;
import java.util.NoSuchElementException;
 
 
public class LinkedList<T> implements Iterable<T> {
 
    Node<T> head, current;
 
    private static class Node<T> {
        T data;
        Node<T> next;
 
        Node(T data) {
            this.data = data;
        }
    }
 
    public LinkedList(T data) {
        head = new Node<>(data);
    }
 
    public Iterator<T> iterator() {
        return new LinkedListIterator();
    }
 
    private class LinkedListIterator implements Iterator<T> {
 
        Node<T> node = head;
 
        @Override
        public boolean hasNext() {
            return node != null;
        }
 
        @Override
        public T next() {
            if (!hasNext())
                throw new NoSuchElementException();
            Node<T> prevNode = node;
            node = node.next;
            return prevNode.data;
        }
 
        @Override
        public void remove() {
            throw new UnsupportedOperationException("Removal logic not implemented.");
        }
    }
 
    public void add(T data) {
        Node current = head;
        while (current.next != null)
            current = current.next;
        current.next = new Node<>(data);
    }
 
}
 
class App {
    public static void main(String[] args) {
 
        LinkedList<Integer> list = new LinkedList<>(1);
        list.add(2);
        list.add(4);
        list.add(3);
 
        //Test #1
        System.out.println("using Iterator:");
        Iterator<Integer> itr = list.iterator();
        while (itr.hasNext()) {
            Integer i = itr.next();
            System.out.print(i + " ");
        }
 
        //Test #2
        System.out.println("\n\nusing for-each:");
        for (Integer data : list) {
            System.out.print(data + " ");
        }
    }
}

输出

using Iterator:
1 2 4 3
using for-each:
1 2 4 3 

这将在 Java 7+中运行。你可以通过替换来使其在 Java 5 和 Java 6 上运行:

LinkedList<Integer> list = new LinkedList<>(1);

LinkedList<Integer> list = new LinkedList<Integer>(1);

或者通过合并兼容的更改,只是任何其他版本。