【问题标题】:How can I make a class iterable in Java to use foreach loop如何使 Java 中的类可迭代以使用 foreach 循环
【发布时间】:2022-01-01 07:15:26
【问题描述】:

我尝试创建一个手动的 LinkedList 类,然后我创建了一个函数来合并两个 LinkedList。我为我的 LinkedList 类实现了 iterable 以使用 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);
    }
}

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

【问题讨论】:

  • 我相信你需要定义一个新的类ListIterator,它有方法“boolean hasNext()”和“R getNext()”方法,然后有你的“iterator()”方法返回 ListIterator 的一个实例。

标签: java linked-list iterator iterable


【解决方案1】:

我终于可以用这个修改了:

@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

【讨论】:

    【解决方案2】:

    您实现了Iterable 接口。

    Documentation.

    公共接口可迭代

    实现这个接口允许一个对象成为 “for-each 循环”语句。

    至少你需要返回一个迭代器。

    迭代器 iterator()

    返回 T 类型元素的迭代器。

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

    【讨论】:

    • 由于我不是Java程序员,我不知道如何修改它。我是一名 R 程序员,但现在我需要 Java 来解决这个问题。
    • 那么,当 Java 已经提供了 LinkedList 时,为什么还要实现 LinkedList 呢?如果这是一个“学习 Java”的练习,那么我写的应该足以编写代码;我不打算写它。如果这不是为了教一些 Java,那么使用 java.util.LinkedList。
    • 是的,这是一个练习。
    猜你喜欢
    • 2014-02-26
    • 2021-01-26
    • 2012-03-04
    • 2022-06-26
    • 2020-02-21
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多