Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用迭代器检索当前和以前的元素_Java_Iterator_Listiterator - Fatal编程技术网

在Java中使用迭代器检索当前和以前的元素

在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()) {

我的Java代码中有一个ArrayList,我想检索它的当前元素和以前的元素

这是我写的代码:

    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
时返回相同的元素!谢谢兄弟!你是个好老师!