Java:使用迭代器打印具有嵌套(二次)循环的所有唯一无序对

时间:2014-09-26 12:41:49

标签: java iterator nested-loops

以下代码打印给定列表的所有唯一无序对。

//Input: List containing {a, b, c, d, e}
//Output: (a, b) (a, c) (a, d) (a, e) (b, c) (b, d) (b, e) (c, d) (c, e) (d, e)

private static void pairs(List<Character> list) {
    for (int i = 0; i < list.size()-1; i++){
        for (int j = i+1; j < list.size(); j++){
            System.out.print("("+list.get(i)+", "+list.get(j)+") ");
        }
    }
}

我想使用迭代器做同样的事情,因为使用&#34; get&#34;如果列表是LinkedList,那将非常糟糕。我在 j = i + 1 部分遇到问题。我正在寻找的代码应该看起来像这样。

private static void pairs2(List<Character> list) {
    Iterator<Character> iter1 = list.iterator();
    while(iter1.hasNext()){
        char char1 = iter1.next().charValue();
        Iterator<Character> iter2 = ???;
        while (iter2.hasNext()){
            char char2 = iter2.next().charValue();
            System.out.print("("+char1+", "+char2+") ");
        }
    }
}

编辑以供将来参考:如下所示,最好的方法是使用ListIterator而不是Iterator。

ListIterator <Character> iter1 = list.listIterator();
...
ListIterator<Character> iter2 = list.listIterator(iter1.nextIndex());

2 个答案:

答案 0 :(得分:4)

如果您通过ListIterator使用Iterator而不是普通list.listIterator(),则可以通过iter1.nextIndex()获取其索引。然后,您可以从该位置iter2开始list.listIterator(index)

答案 1 :(得分:0)

只需创建另一个迭代器

int count = 0;
while(iter1.hasNext()){
    count++;
    char char1 = iter1.next().charValue();
    Iterator<Character> iter2 = list.iterator();
    //Skip first count elements
    for(int j; j<count; j++){
         iter2.next();
    }
    while (iter2.hasNext()){
        char char2 = iter2.next().charValue();
        System.out.print("("+char1+", "+char2+") ");
    }
}

你可以同时拥有其中几个。