2

我正在尝试确定foreach嵌套在另一个 foreach 循环内的循环中的当前对象是否都在ArrayList迭代相同的对象,它们当前是否都在对同一个对象进行迭代。由于 foreach 循环的约定,似乎没有一种简单的方法可以获取 ArrayList 中对象的当前索引,以便能够比较当前对象是否相等。continue本质上,如果两个 foreach 循环当前都在迭代同一个对象,我想在内部 foreach 循环中覆盖当前对象。

例如,给定一个ArrayList<Object>命名objects

for (Object a : objects) {

    for (Object b : objects) {

        //If both loops are currently iterating over the same object
        //from the ArrayList objects, skip to the next iteration of the inner
        //foreach loop
        if (a == b) {

            continue;

        }

        //If both foreach loops are not iterating over the same object
        //execute some operation

    }

}

是使用==运算符来测试当前正在迭代的两个对象是否是同一个可靠对象,还是简单地使用常规for循环并根据它们的索引比较对象更好?

4

3 回答 3

4

==在这种情况下比较对象是可以的,但前提是您没有将同一个对象多次放入列表中。如果您在多个位置的列表中有相同的对象,那么这是不行的,您应该使用标准 for 循环。

于 2013-01-12T21:54:34.300 回答
0

如果将同一对象添加到ArrayList多次==相等比较中,则可能会产生不希望的结果。检查您是否没有比较相同的索引项ArrayList(即:您当前位于 2D 矩阵的对角线上)

考虑一下:

Iterator<Object> outerIterator, innerIterator;
outerIterator = objects.iterator();
for (int i=0; outerIterator.hasNext(); ++i) {
    a = outerIterator.next();
    innerIterator = objects.iterator();
    for(int j=0; innerIterator.hasNext(); ++j) {
        b = innerIterator.next();
        //comparing for elements for SAME index of iteration
        //NOT comparing for element equality
        if(i==j) { continue; } 
        // else do stuff with a & b
    }
}

等效地:(我认为更漂亮)

int i=0;
for (Object a : objects) {
    int j=0;
    for (Object b : objects) {
      //comparing for elements for SAME index of iteration
      //NOT comparing for element equality
      if (i==j) { continue; }
      //else do stuf with a & b
      ++j;
    }
    ++i;
}

总结:

如果要检查浅等式,请使用a==b.

如果要检查深度相等,请使用a.equals(b).

如果要检查索引是否相等,请使用i==j.

于 2013-01-12T22:14:45.307 回答
0

我会这样做:

for (Object a : objects) {

    for(int i = 0; i < objects.size(); i++) {

        if(a.equals(objects.get(i)) {

            continue;
        }

    }

}

在我看来,这是他最简单的方法。

于 2013-01-12T21:54:52.947 回答