java使用迭代器进行“向下”迭代的优雅方式
例如,对于一个列表{1,2,3,4},我必须比较对(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)。使用normal 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];
}
}
# 1 楼答案
由于项目的索引在这里显然很重要,我认为在这种情况下,您应该坚持使用基于for循环的旧索引。它可能没有那么漂亮,但它将是明确的
如果你经常这样做,你可以将代码封装在一个方法中,并为每对代码传递一个调用的方法
# 2 楼答案
也许不是那么优雅,但有可能:
# 3 楼答案
您可以实现自己的Iterator来实现这一点。您还必须创建一个简单的包装器对象,以允许您同时返回两个项(Java中没有内置元组类型,这非常恼人!)
然而,仅仅通过实现
Iterator
不会让您在for
循环中直接使用它。你将不得不这样做:但是,如果您对正在使用的
list
类进行子类化,您可以重写iterator()
方法并返回自己的迭代器,那么您就可以在for循环中直接使用自定义列表类及其迭代器# 4 楼答案
这仍然使用嵌套循环,但使用ListIterator。 ListIterator可以通过
List
接口的listIterator(idx) method获得。它实际上并不比for循环更优雅,但如果列表不是随机可访问的,例如aLinkedList
,它的性能可能会更好