遍历数组以比较对象属性而不重复

时间:2020-09-23 21:07:17

标签: java oop object

我试图在网格上移动对象并计算战斗次数(当它们接触时),但是每当我进行一次互动时,它们都会对其计数两次。我知道为什么,但是想不出办法。

代码:

        // Move all the objects
        for(int i = 0; i < objectArray.length; i++) {
            objectArray[i].move();
        }

        // Check to see if any of the objectsare touching
        for(int i = 0; i < objectArray.length; i++) {

            for(int j = 0; j < objectArray.length; j++) {

                if(objectArray[i] != objectArray[j]) {

                    if(objectArray[i].getX() == objectArray[j].getX() && objectArray[i].getY() == objectArray[j].getY()) {


                            System.out.println("FIGHT");
                            System.out.println("There is a fight between " + objectArray[i].getName() + " and " + objectArray[j].getName() + "." );

                            fights++;

                        }
                    }
                }
            }
        }

2 个答案:

答案 0 :(得分:1)

您要遍历整个列表,对于列表中的每个元素,您...要遍历整个列表。再次。

不要这样做-如果您希望列表中的每个项目与列表中的其他项目“相遇”,那么,请考虑一下第一个循环:第一个“战斗机”将在您的循环中相遇本身(j = 0),然后遇到所有其他战斗机。您可以使用if(第一个if)消除“满足自己”选项。

然后,下一架战斗机(i = 1)将再次从头开始:它将遇到第一架战斗机(j = 0),重复我们已经看到的战斗,然后相遇,然后再与场上的其他人相遇。

解决方案是不从“ 0”开始内循环,而是从自己之后的下一个战斗机开始:第二个战斗机应该首先遇到第三个战斗机(并跳过第一个战斗机和它自己)。因此,您只需要int j = i + 1,而不是int j = 0。然后,您还可以完全消除“不要与自己打架”的问题,因为现在不可能发生这种情况。

答案 1 :(得分:-1)

您可以设置循环属性,可能不是最好的答案,但可以确保不比较数组中相同的两个对象。

代码: //循环属性 字符串lastFightObejectOne =“”,lastFightObjectTwo =“”;

        // Move all the objects
        for(int i = 0; i < objectArray.length; i++) {
            objectArray[i].move();
        }

        // Check to see if any of the objects are touching
        for(int i = 0; i < objectArray.length; i++) {

            for(int j = 0; j < objectArray.length; j++) {

                if(objectArray[i] != objectArray[j]) {

                    if(objectArray[i].getX() == objectArray[j].getX() && objectArray[i].getY() == objectArray[j].getY()) {

                            if(!lastFightObejectOne.equal(objectArray[i].getName()) && (!lastFightObejectTwo.equal(objectArray[j].getName())) {
                            System.out.println("FIGHT");
                            System.out.println("There is a fight between " + objectArray[i].getName() + " and " + objectArray[j].getName() + "." );

                            lastFightObjectOne = objectArray[i].getName();
                            lastFightObectTwo = objectArray[j].getName();

                            fights++;
                            }
                        }
                    }
                }
            }
        }
相关问题