有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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];
    }
}

共 (4) 个答案

  1. # 1 楼答案

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

    如果你经常这样做,你可以将代码封装在一个方法中,并为每对代码传递一个调用的方法

  2. # 2 楼答案

    也许不是那么优雅,但有可能:

    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
      }
    }
    
  3. # 3 楼答案

    您可以实现自己的Iterator来实现这一点。您还必须创建一个简单的包装器对象,以允许您同时返回两个项(Java中没有内置元组类型,这非常恼人!)

    然而,仅仅通过实现Iterator不会让您在for循环中直接使用它。你将不得不这样做:

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

    但是,如果您对正在使用的list类进行子类化,您可以重写iterator()方法并返回自己的迭代器,那么您就可以在for循环中直接使用自定义列表类及其迭代器

  4. # 4 楼答案

    这仍然使用嵌套循环,但使用ListIterator。 ListIterator可以通过List接口的listIterator(idx) method获得。它实际上并不比for循环更优雅,但如果列表不是随机可访问的,例如a 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();
        }
    }