Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在没有冗余的情况下比较相同的列表_Java_Foreach - Fatal编程技术网

Java 在没有冗余的情况下比较相同的列表

Java 在没有冗余的情况下比较相同的列表,java,foreach,Java,Foreach,我有这个密码 public void update(List<GameObject> objects) { for (GameObject object1 :objects){ for (GameObject object2 : objects){ if (!object1.equals(object2)) object1.collisionHandling(object2); } } public v

我有这个密码

public void update(List<GameObject> objects) {
        for (GameObject object1 :objects){
        for (GameObject object2 : objects){
            if (!object1.equals(object2)) object1.collisionHandling(object2);
        }
    }
public void更新(列出对象){
用于(游戏对象对象1:对象){
用于(游戏对象对象2:对象){
如果(!object1.equals(object2))object1.collisionHandling(object2);
}
}
我需要比较所有项目,但我显然不想将每个列表项目与自身进行比较;因此,项目1和项目1,我也不想将项目2与3进行比较,然后在下一个循环中,将项目3与2进行比较,以此类推。
大多数示例对(i=0,i使用编号数组进行三角形比较的标准方法是:

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);
    }
}
for(int indexI=0;indexI

注意,索引XJ从索引1到siz()/ 可以使用java 8流,甚至可以考虑并行流。 需要在

游戏对象
中实现可比较的界面

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)
        )
    );
}
或者在使用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

没有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更新(列出对象){
用于(游戏对象对象1:对象){
用于(游戏对象对象2:对象){
如果(object1!=object2&&object1.compareTo(object2)<0){
对象1.冲突处理(对象2);
}
}
}
}

请标记java,并使用索引。
列表
接口有
get
方法。
if(object1==object2){continue;}
谢谢@marcaciern没有做任何更改。现在只是对称比较。第一行的限制应该是(objects.size()-1)。如果对象的数量发生变化,这是否有效(这是一个小行星游戏,因此子弹可以随时发射,碰撞可能会使单个小行星分裂为3个新的单独小行星对象)它还能用吗?@JamesDonnelly:只要在检查碰撞时不改变列表的大小,比较就行了。@GilbertLeBlanc:如果你愿意,但是当indexI是size-1时,那么indexJ=size(),因此不会计算内部循环。理论上,我想你保存了一个“get”调用,但仍然如此。
public void update(List<GameObject> objects) {
    for(GameObject object1 : objects) {
        for(GameObject object2 : objects) {
            if(object1 != object2 && object1.compareTo(object2) < 0) {
                object1.collisionHandling(object2);
            }
        }
    }
}