比较相同的列表没有冗余

时间:2015-03-17 17:16:02

标签: java foreach

我有这段代码

public void update(List<GameObject> objects) {
        for (GameObject object1 :objects){
        for (GameObject object2 : objects){
            if (!object1.equals(object2)) object1.collisionHandling(object2);
        }
    }

我需要比较所有项目,但我显然不想将每个列表项目与自身进行比较;所以第1项和第1项,我也不想将第2项与3进行比较,然后在下一循环3与2比较等。 大多数示例使用编号的数组(i = 0,i&lt; 5,i ++)但我有一个列表。 我将如何提高此代码的效率?


编辑:我现在可以忽略循环上的相同项目只需要停止对称比较。 2-3,3-2等。

3 个答案:

答案 0 :(得分:3)

进行这种三角比较的标准方法是:

for (int indexI = 0; indexI < objects.size(); indexI++) {
    GameObject object1 = objects.get(indexI);
    for (int indexJ = indexI + 1; indexJ < objects.size(); indexJ++) {
       GameObject object2 = objects.get(indexJ);
       object1.collisionHandling(object2);
    }
}

请注意,indexJ从indexI + 1变为size()。

答案 1 :(得分:0)

您可以使用Java 8流,甚至可以考虑并行流。

要求您在GameObject

中实施Comparable接口
public void update(List<GameObject> objects) {
    objects.parallelStream().forEach(
        object1 -> objects.parallelStream().filter(
            object2 -> object1 != object2 && object1.compareTo(object2) < 0
        ).forEach(
            object2 -> object1.collisionHandling(object2)
        )
    );
}

输出将是:

3 collision 4
2 collision 3
2 collision 4
0 collision 3
0 collision 2
1 collision 2
1 collision 4
1 collision 3
0 collision 1
0 collision 4

或者当使用stream而不是parallelStream时:

0 collision 1
0 collision 2
0 collision 3
0 collision 4
1 collision 2
1 collision 3
1 collision 4
2 collision 3
2 collision 4
3 collision 4

答案 2 :(得分:0)

如果没有Java 8,您只需在Comparable中实现GameObject界面即可使用此代码:

public void update(List<GameObject> objects) {
    for(GameObject object1 : objects) {
        for(GameObject object2 : objects) {
            if(object1 != object2 && object1.compareTo(object2) < 0) {
                object1.collisionHandling(object2);
            }
        }
    }
}