Java创建您自己的Iterable结构,以用于Iterator或for-each循环。

示例

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

  1. 我们要迭代的内容必须是Iterable公开的iterator()。

  2. java.util.Iterator通过覆盖设计hasNext(),next()并remove()。

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

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("删除逻辑未实现。");
        }
    }
 
    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);
 
        //测试#1
        System.out.println("u唱迭代器:");
        Iterator<Integer> itr = list.iterator();
        while (itr.hasNext()) {
            Integer i = itr.next();
            System.out.print(i + " ");
        }
 
        //测试#2
        System.out.println("\n\nusing for-each:");
        for (Integer data : list) {
            System.out.print(data + " ");
        }
    }
}

输出结果

u唱迭代器:
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);

或任何其他版本(通过合并兼容的更改)。