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);
}
}
}
}