不冗余地比较相同的列表
Comparing the same list without redundancy
我有这个代码
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<5, i++) 但我有一个列表。
我将如何着手提高这段代码的效率?
编辑:我现在可以忽略循环中的相同项目,只需要停止对称比较。 2-3、3-2 等
进行这种三角比较的标准方法是:
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()。
您可以使用 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
或者当使用流代替并行流时:
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
如果没有 Java 8,您只需在 GameObject
中实现 Comparable
接口并使用此代码:
public void update(List<GameObject> objects) {
for(GameObject object1 : objects) {
for(GameObject object2 : objects) {
if(object1 != object2 && object1.compareTo(object2) < 0) {
object1.collisionHandling(object2);
}
}
}
}
我有这个代码
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<5, i++) 但我有一个列表。 我将如何着手提高这段代码的效率?
编辑:我现在可以忽略循环中的相同项目,只需要停止对称比较。 2-3、3-2 等
进行这种三角比较的标准方法是:
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()。
您可以使用 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
或者当使用流代替并行流时:
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
如果没有 Java 8,您只需在 GameObject
中实现 Comparable
接口并使用此代码:
public void update(List<GameObject> objects) {
for(GameObject object1 : objects) {
for(GameObject object2 : objects) {
if(object1 != object2 && object1.compareTo(object2) < 0) {
object1.collisionHandling(object2);
}
}
}
}