例如,对于列表{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];
}
}
答案 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循环中。