使用迭代器进行“向下”迭代的优雅方式

时间:2012-02-28 13:45:16

标签: java iterator

例如,对于列表{1,2,3,4},我必须比较对(1,2),(1,3),(1,4),(2,3),(2) ,4),(3,4)。正常for循环的方法是:

for(i=0 ; i<list.size() ; i++){
    for(j=i+1 ; j<list.size() ; j++){
    //do stuff with list[i] and list[j];
    }
}

我可以用迭代器做这样的事情(见下文)吗?

for (int i : list){
    for(int j : [list after index i]){
    //do stuff with list[i] and list[j];
    }
}

4 个答案:

答案 0 :(得分:1)

也许不是优雅,但可能:

int lastIndex = list.size()-1;
for (Object i : list) {
  for (Object j : list.sublist(list.indexOf(i), list.size()-1)) {
    // do what has to be done
  }
}

答案 1 :(得分:1)

由于项目的索引在这里显然很重要,我认为在这种情况下你应该坚持使用旧的基于索引的for循环。它可能不是很漂亮,但它会是明确的。

如果你这么做很多,你可以将代码封装在一个方法中,并传递一个方法来调用每对。

答案 2 :(得分:1)

这仍然使用嵌套循环,但使用ListIterator代替。 可以通过List接口的listIterator(idx) method获取ListIterator。它并不比for循环更优雅,但如果列表不是随机可访问的,则表现更好,例如LinkedList

for (ListIterator i=list.listIterator(); i.hasNext(); ) {
    Object a = i.next();
    for (Iterator j=list.listIterator(i.previousIndex()); j.hasNext(); ) {
        Object b = j.next();
    }
}

答案 3 :(得分:0)

您可以实施自己的Iterator来执行此操作。您还必须创建一个简单的包装器对象,让您一次返回两个项目(非常烦人的是,Java中没有内置的元组类型!)。

只需实施Iterator但不允许您直接在for循环中使用它。你必须做这样的事情:

Iterator<MyPairObject> iterator = new MyIterator(list);
while (iterator.hasNext()) {
    ...
}

但是,如果你继承了你正在使用的list类,你可以覆盖iterator()方法并返回自己的迭代器 - 那么你将能够使用你的自定义列表类,它是迭代器直接在for循环中。