【发布时间】:2012-11-09 02:24:46
【问题描述】:
我有一个 LinkedList,我需要来回迭代多次。我正在使用它来跟踪将动态创建的工作流中的一系列页面。这不符合我的预期。给定这个例子:
LinkedList<String> navigationCases;
navigationCases.add("page1");
navigationCases.add("page2");
navigationCases.add("page3");
navigationCases.add("page4");
ListIterator navigationItr = navigationCases.listIterator();
navigationItr.next(); // Returns page1
navigationItr.next(); // Returns page2
navigationItr.previous(); //Returns page2 again
navigationItr.next(); //Returns page2 again
我想我可能是错误地构建了我的列表,或者使用了错误的迭代器,但是在阅读了文档之后,这似乎是设计使然:
ListIterator 没有当前元素;它的光标位置始终位于调用 previous() 将返回的元素与调用 next() 将返回的元素之间。
还有:
(Next) 返回列表中的下一个元素。可以重复调用此方法以遍历列表,或与调用 previous 混合调用以来回移动。 (请注意,交替调用 next 和 previous 将重复返回相同的元素。)
因此,阅读本文后,很清楚为什么我的代码会如此行事。我只是不明白为什么它应该这样工作。甚至 remove 似乎也在向后弯曲以适应这种实现:
请注意,remove() 和 set(Object) 方法不是根据光标位置定义的;它们被定义为对调用 next() 或 previous() 返回的最后一个元素进行操作。
从概念上讲,LinkedList 似乎很好地模拟了我的工作流案例,但我不能使用以这种方式运行的迭代器。我是否在这里遗漏了什么,或者我应该只编写自己的课程来维护一个案例列表并浏览它们?
【问题讨论】:
-
为什么你不能“使用这样的迭代器”?世界其他地方也是如此。只需接受它的工作原理并按照预期使用它。
-
之所以如此,是因为它使从头开始的迭代和删除与从头开始的迭代和删除的工作方式完全相同。
-
如果必须,将核心功能包装在您自己的逻辑中,当您请求
myIterator.previous()时调用iterator.previous().previous()(显然是伪) -
@Madbreaks 当上一个操作是 next() 时,您只需调用 previous 两次。否则你只调用一次。因此我很沮丧:)
-
这是非常令人沮丧的行为。我花了几个小时来重现和调试包含此代码的问题。
标签: java iterator linked-list