使用迭代器迭代列表并比较连续元素

时间:2016-08-05 13:15:41

标签: java list loops iterator

我想比较单个列表中的每个元素,下面的代码为我提供了解决方案:

for (int i = 0; i < list.size(); i++) {
    for (int j = i + 1; j < list.size(); j++) {
        // compare 
    }
}

它逐个比较元素,例如比较四个元素:

0 to 1
0 to 2
0 to 3
1 to 2
1 to 3
2 to 3

我希望使用迭代器实现与上面相同的功能。我使用迭代器实现:

int i = 0;
for (Iterator<Tuple> it = list.iterator(); it.hasNext();) {
    Tuple tB = null;
    Tuple tA = it.next();

    for(int j = 0; j == i; j++) {
        try {
            tB = it.next();

            if(tA.Username.equals(tB.Username) && .....) {
                System.out.println("Match");
            } else {
                System.out.println("Not Matched");
            }
            i++;
        } catch(NoSuchElementException exc) {
            throw exc;
        }   
    }
}

Tuple是一个包含一些字符串属性的类。

此代码仅将第一个元素与其他元素进行比较并抛出NoSuchElementException,但我想从内部for循环移动到外部for循环以保持遍历。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

嗨,你得到了Exception,因为你的it.next()在内部for循环中。你需要第二个迭代器。

 for (Iterator<Tuple> it = list.iterator(); it.hasNext();) 
{
       Tuple tA = it.next();
       List<Tuple> tmpList = new ArrayList<Tuple>(list);
       tmpList.remove(tA);
  for( Iterator<Tuple> it2 = tmpList.iterator(); it2.hasNext();)     {
        try{
            Tuple tB=it2.next();

            if(tA.Username.equals(tB.Username) && .....)
            {
                System.out.println("Match");
            }
            else
            {
                System.out.println("Not Matched");
            }
            i++;
        }
        catch(NoSuchElementException exc)
        {
            throw exc;
        }   
    }
}

答案 1 :(得分:1)

要赞美shsvd98 answer,您可以使用 li.Attributes.Add("style", "color:" + color); 代替ListIteratorIterator扩展了ListIterator并提供了更多功能。

例如,以下代码与您的第一个代码块完全相同。它也不会将元素与自身进行比较,也不需要在每个外部for循环迭代后创建另一个Iterator

List

我运行了上述代码,用Tuple tA = null; Tuple tB = null; for (ListIterator<Tuple> one = list.listIterator(); one.hasNext();) { // set 'tA' here, not in the nested for loop tA = one.next(); // initialize 'two' with the next index of 'one' for(ListIterator<Tuple> two = list.listIterator(one.nextIndex()); two.hasNext();) { // set 'tB' here tB = two.next(); // debug line used in output below this code block // System.out.print("tA:" + tA + " to tB:" + tB + " "); try { if(tA.username.equals(tB.username)) { System.out.println("Match"); } else { System.out.println("Not Matched"); } } catch(NoSuchElementException exc) { throw exc; } } } 切换出Tuple

String

如果您对使用Populated ArrayList with ["a", "b", "c", "b"] Output: tA:a to tB:b Not Matched tA:a to tB:c Not Matched tA:a to tB:b Not Matched tA:b to tB:c Not Matched tA:b to tB:b Match tA:c to tB:b Not Matched 优于ListIterator的好处感到好奇,那么ListIterator documentation会提供更多见解。