在Java中使用迭代器检索当前和以前的元素
我的Java代码中有一个ArrayList,我想检索它的当前元素和以前的元素 这是我写的代码:在Java中使用迭代器检索当前和以前的元素,java,iterator,listiterator,Java,Iterator,Listiterator,我的Java代码中有一个ArrayList,我想检索它的当前元素和以前的元素 这是我写的代码: List<Graph> graphs = new ArrayList<Graph>(); graphs.addAll(bestGraphs.values()); ListIterator<Graph> listItr = graphs.listIterator(); while(listItr.hasNext()) {
List<Graph> graphs = new ArrayList<Graph>();
graphs.addAll(bestGraphs.values());
ListIterator<Graph> listItr = graphs.listIterator();
while(listItr.hasNext()) {
if(!listItr.hasPrevious()) {
listItr.next();
} else {
Graph g1 = listItr.previous();
Graph g2 = listItr.next();
croisementGraphs(g1, g2);
listItr.next();
}
}
List graphs=new ArrayList();
graphs.addAll(bestGraphs.values());
ListIterator listItr=graphs.ListIterator();
while(listItr.hasNext()){
如果(!listItr.hasPrevious()){
listItr.next();
}否则{
图g1=listItr.previous();
图g2=listItr.next();
croisementGraphs(g1,g2);
listItr.next();
}
}
croisementGraphs(g1,g2)
是一个函数,它应该同时获取ArrayList的当前元素和以前的元素(图)
这里的问题是,变量g1
和g2
都指向同一个元素
当我阅读与previous()
函数相关的Javadoc时,它说:
(请注意,交替调用next和previous将重复返回相同的元素。)
在这种情况下我该怎么办
谢谢 调用previous会向后移动ListIterator的位置。因此,你需要考虑你处于什么样的位置。 假设您位于位置N,调用previous,它将返回N并移动到N-1,然后调用next,它将返回N并将指针移动到它 因此,您需要致电: graphs.get(listItr.previousIndex())
如果不希望它移动listIterator的位置。尝试调用
listItr.next()代码>两次,如下所示:
while(listItr.hasNext()) {
if(!listItr.hasPrevious()) {
listItr.next();
listItr.next();
} else {
...
}
如需了解更多信息,请进入,您可以使用缩减:
graphs.stream().reduce((g1, g2) -> {croisementGraphs(g1, g2); return g2;});
如果使croisementGraphs()
返回其第二个参数,则可以:
graphs.stream().reduce(this::croisementGraphs);
您可以使用您的解决方案,只需使用实际的下一项:
Graph g1 = listItr.previous();
listItr.next();
Graph g2 = listItr.next();
croisementGraphs(g1, g2);
我想你应该读一下迭代器,恐怕你不明白迭代器是如何工作的。我将试着简单地解释一下:
- 迭代器位于项之间,而不是项之间
- 当调用
next
或previous
时,迭代器返回他们刚刚“浏览”过的项
小示例:让我们看几个项目的列表:[1,2,3]
,并以下一种形式呈现:[.1.2.3.]
,让我们通过在其中放置字母x
来显示迭代器的位置。现在,一些操作和相应的状态更改:
ListIterator x = list.listIterator(); // [x1.2.3.]
x.next(); // [.1x2.3.], returns 1
x.previous(); // [x1.2.3.], returns 1
x.next(); // [.1x2.3.], returns 1
x.next(); // [.1.2x3.], returns 2
如果要使用迭代器
,请保留对原始元素的引用。或者不要使用迭代器。只需使用带有适当索引的for
语句。这就是为什么它在依次调用previous
和next
时返回相同的元素!谢谢兄弟!你是个好老师!