如何使 class 在 Java 中可迭代以使用 foreach 循环

How can I make a class iterable in Java to use foreach loop

我尝试创建一个手动 LinkedList class 然后我创建了一个函数来合并两个 LinkedList。我为我的 LinkedList class 实现了可迭代的,以便使用 foreach 循环,但出了点问题。我不知道如何覆盖 iterator() 函数来解决问题。这是我的代码:

Node.java
package app;
public class Node<R> {
    private R Data;
    private Node<R> nextNode;
    public final void setData(R data) {
        Data = data;
    }
    public R getData() {
        return Data;
    }
    public void setNextNode(Node<R> nextNode) {
        this.nextNode = nextNode;
    }
    public Node<R> getNextNode() {
        return nextNode;
    }
    public Node(R dR){
        this.setData(dR);
    }
}

LinkedList.java

package app;
import java.util.Iterator;
public class LinkedList<R> implements java.lang.Iterable<R>{
    private Node<R> headNode;
    public void addNode(Node<R> nR){
        if(headNode == null){
            headNode = nR;
        } else {
            nR.setNextNode(headNode);
            this.headNode = nR;
        }
    }
    public void addData(R dR){
        Node<R> nR = new Node<>(dR);
        addNode(nR);
    }
    public LinkedList(){
        headNode = null;
    }

    @Override
    public Iterator<R> iterator() {
        return null;
    }
}

App.java

package app;
public class App {
    public static <R>LinkedList<R> unionLinkedList(LinkedList<R> list , LinkedList<R> list2){
        LinkedList<R> unionLinkedList = new LinkedList<>();
        for (R dR : list) {
            unionLinkedList.addData(dR);
        }
        for (R dR : list2) {
            unionLinkedList.addData(dR);
        }
        return unionLinkedList;
    }
    public static void main(String[] args) throws Exception {
        LinkedList<Integer> list = new LinkedList<>();
        LinkedList<Integer> list2 = new LinkedList<>();
        list.addData(3);
        list.addData(9);
        list.addData(8);
        list2.addData(11);
        list2.addData(5);
        list2.addData(7);
        LinkedList<Integer> u = unionLinkedList(list, list2);
    }
}

我知道我必须在 iterator() 中更改 return null;,但我不知道应该用什么替换它。

您实现了 Iterable 接口。

Documentation.

public interface Iterable

Implementing this interface allows an object to be the target of the "for-each loop" statement.

至少你需要return一个迭代器。

Iterator iterator()

Returns an iterator over elements of type T.

'null' (如您的代码中所示)不是迭代器。您需要实现一个 class(如果您愿意,可以嵌套),它知道如何迭代您的特定链表实现。可能,它所需要的只是一个 'next node to process' 成员; next() 和 hasNext() 方法可以用它来实现。

最后我可以通过这个修改来完成:

@Override
public Iterator<R> iterator() {
    return new Iterator<R>(){
        Node<R> current = (Node<R>) headNode;

        @Override
        public boolean hasNext(){
            return current != null;
        }

        @Override
        public R next(){
            if (hasNext()){
                R dR = current.getData();
                current = current.getNextNode();
                return dR;
            }
            return null;
        }
    };
}

LinkedList.java