【问题标题】:Java Iterator Not Working With Single Iterable ObjectJava 迭代器不适用于单个可迭代对象
【发布时间】:2013-04-12 07:38:35
【问题描述】:

我遇到了迭代器的问题。我正在编写一个自定义链表,因为它使用迭代器来遍历列表。

迭代器如下所示:

public class NodeIterator implements Iterator<Node> {
private Node current = head;
private Node lastReturned = head;

public boolean hasNext() {
    return lastReturned.getLink() != null;
}

public Node next() {
    lastReturned = current;
    current = current.getLink();
    return lastReturned;
}

public void remove() {
    removeNode(lastReturned);
    lastReturned = null;
}
}

我仍处于早期阶段,因此我正在通过使用此方法填充节点来从控制台测试数据结构。

private static void MethodToPopulateNodes() {
MyObject o = new MyObject();
String[] responses = new String[prompts.length];
scanner = new Scanner(System.in);

boolean done = false;
String s = null;

while (!done) {
    int i = 0;
    for (String prompt : prompts) {
        System.out.println(prompt);
        s = scanner.nextLine();
        if (s.equalsIgnoreCase("stop")) {
            done = true;
            break;
    } else {
        responses[i] = s;
    }
        i++;
    }
    if (done) {
        break;
    }
        o = new MyObject(responses);
        myNode.add(c);
}
}

当我在只有一个节点的情况下尝试使用迭代器时,它什么也没做。没有错误或任何东西。但是,如果我有多个节点,则此 foreach 可以完美运行。

public static void main(String[] args) {
myNode = new Node();

methodToPopulateLinkedList();

for (Node node : myNode) {
        //toString is overridden for my object
    System.out.println(node.getData().toString());
}

}

更新:我编辑了迭代器以在第一次迭代时返回 hasNext() == true

public class NodeIterator implements Iterator<Node> {
private boolean done = false;
private Node current = head;
private Node lastReturned = head;

public boolean hasNext() {
    if (head == tail && head != null && !done) {
    done = true;
    return true;
    }
    return lastReturned.getLink() != null;
}

public Node next() {
    lastReturned = current;
    current = current.getLink();
    return lastReturned;
}

public void remove() {
    removeNode(lastReturned);
    lastReturned = null;
}
}

我觉得这很笨拙,但它确实有效。似乎 Java 在调用 next 之前先调用 hasNext(),所以我必须区别对待特殊情况。

|123

hasNext() == true
next() == 1

1|23

hasNext() == true
next() == 2

12|3

其中| 等于光标。那准确吗?有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: java foreach iterator iterable


    【解决方案1】:

    如果只有一个节点,它的 ->next 的特殊情况将为空。在循环之前,尝试打印出第一个节点,我认为您的循环可能正在向前看。

    【讨论】:

    • 嗯...我想过。问题是当元素数 > 1 时,第一个节点正在打印。如果我启动 foreach,我会得到两个第一个节点。
    • 好的,那么让我们这样做吧。删除循环并尝试打印 node + node.next + ... 一个三节点数组。
    • 在当前代码中也是如此。如果在创建新节点后没有分配任何内容,getData 会返回什么?
    • getData 是节点中的数据 - 实际的 MyObject 对象。我将尝试删除循环并单步执行迭代器。
    • 我删除了 foreach 以打印出对象并使用了迭代器。它仍然不适用于单个节点,并且在 > 1 时行为正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2023-03-07
    • 2011-11-22
    相关资源
    最近更新 更多