gpt4 book ai didi

Java listIterator() 使用 .next() 和 .prev() 给我奇怪的输出

转载 作者:行者123 更新时间:2023-12-01 19:27:13 25 4
gpt4 key购买 nike

我一直在从事一个项目,在该项目中,我使用单独的“节点类”从头开始实现了(双向链表)。

然后我需要对“节点链接列表”进行排序。由于我从头开始实现链接列表,因此为了对其进行排序,我还必须从头开始为链接列表实现“合并排序”,这有点耗时。

所以我考虑使用 java.util 中的“Java Linked List”与 listIterator() 然后使用 Collections.sort() 对我的 LinkedList 进行排序,但它的 next() 和 previous() 给了我一些意想不到的奇怪输出与我使用 (.next) 和 (.prev) 直接访问来遍历节点的 LinkedList 时相比。例如,假设:

node1.time = 7;
node2.time = 8;
node3.time = 9;
node4.time = 10;

LinkedList<Node> nodeList = new LinkedList<Node>():
nodeList.add(node1); nodeList.add(node2); nodeList.add(node3); nodeList.add(node4);

void testFunction() {

ListIterator<Node> nodesIterator = nodeList.listIterator();

Node current;

for (int i = 0; i < 2; i++) {
current = nodesIterator.next();
System.out.println("current = " + current.time);
}
System.out.println("outside of loop:");

System.out.println("move current backward:");
current = nodesIterator.previous();
System.out.println("current = " + current.time);

System.out.println("move current forward:");
current = nodesIterator.next();
System.out.println("current = " + current.time);

System.out.println("Passing nodesIterator into testFunction2():");
testFunction2(nodesIterator);
}


void testFunction2(ListIterator<Node> nodesIterator) {

System.out.println("inside testFunction2():");

Node current = nodesIterator.next();
System.out.println("current = " + current.time);

System.out.println("move current backward:");
current = nodesIterator.previous();
System.out.println("current = " + current.time);

System.out.println("move current backward again:");
current = nodesIterator.previous();
System.out.println("current = " + current.time);
}

输出:

current = 7
current = 8

outside of loop:

move current backward:
current = 8
// -> current is suppose to be 7 if previous current inside the loop was 8?

move current forward:
current = 8
// -> current is suppose to be 9 if previous current = 8?

Passing nodesIterator into testFunction2():

inside testFunction2():
current = 9
// -> guess it's correct since previous current = 8?

move current backward:
current = 9
// -> suppose to give me 8 since previous current = 9?

move current backward again:
current = 8
// -> now it actually moved backward!

Java 的 next() 和 prev() 是怎么回事?我从头开始实现的链接列表永远不会给我这些问题,而且将节点传递给其他函数进行遍历更简单,直接访问 (.next) 和 (.prev) 因为我可以只传递 (node.next) 或 ( node.prev) 到其他函数,而无需传入 listIterator() 引用来链接我的节点列表。

我应该从头开始使用我的链接列表并只编写“合并排序”

最佳答案

documentation for ListIterator 解释了这个问题。基本上,“当前”位置不是单个节点,而是两个节点之间。具体来说,它位于调用 prev() 或调用 next() 时将返回的节点之间。例如,在前两次调用 next() 之后,您的迭代器如下所示:

7 -> 8 *->* 9 -> 10 当前介于 89 之间。

调用prev()将返回前一个节点,即8。然后,迭代器将如下所示:

7 *->* 8 -> 9 -> 10 当前介于 78 之间。

接下来,再次调用next()将返回8,依此类推。这是设计使然,您在使用 ListIterator 遍历时必须考虑到这一点。

关于Java listIterator() 使用 .next() 和 .prev() 给我奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61151842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com