Java for循环和数组比较问题

Java for循环和数组比较问题,java,arrays,processing,Java,Arrays,Processing,我正在做一个小练习,我必须初始化一组在屏幕上以随机速度移动的球对象。当球相互碰撞时,我需要球反转速度。问题是,我只能将每个球与它自己进行比较,这样它们就会不断地交叉和来回喷射。我有一种很好的感觉,问题在下面的if语句中,因为我将balls[I]与balls[I]进行比较,其中我同时是相同的数字。当我将球[I]通过intersect函数时,我需要将每个元素与除自身之外的其他元素进行比较。我试过几种方法,但都不管用,而且是多余的 //用于绘制内循环 for(int i = 0; i <

我正在做一个小练习,我必须初始化一组在屏幕上以随机速度移动的球对象。当球相互碰撞时,我需要球反转速度。问题是,我只能将每个球与它自己进行比较,这样它们就会不断地交叉和来回喷射。我有一种很好的感觉,问题在下面的if语句中,因为我将balls[I]与balls[I]进行比较,其中我同时是相同的数字。当我将球[I]通过intersect函数时,我需要将每个元素与除自身之外的其他元素进行比较。我试过几种方法,但都不管用,而且是多余的

//用于绘制内循环

   for(int i = 0; i < balls.length; i++){
    //balls[i].drawBalls();
    //balls[i].moveBalls();
    ***if (balls[i].intersect(balls[i])) {
        balls[i].moveIntersectingBalls();
    }***
  }

这里需要的是一个双循环:

        for(int i = 0; i < balls.length; i++){
        for(int j = 0; j < balls.length; j++){
            if (balls[i].intersect(balls[j]) && i != j) {
                balls[i].moveIntersectingBalls();
            }
        }
    }
在双圈中,你将第一圈中的每个球与第二圈中的所有其他球进行比较,如果你击中一个球,你就称之为移动球;第一个球


这个算法可能会被优化,因为当两个球碰撞时,再次检查它们是无用的,但这是一个好的开始。

我的意思是,这个代码似乎没有多大意义:

if (balls[i].intersect(balls[i])) {
    balls[i].moveIntersectingBalls();
}
但我想你自己也指出了这一点

您是否正在寻找类似于:

for(int i = 0; i < balls.length; i++){
    for(int j = (i+1); j < balls.length; j++){
        if (balls[i].intersect(balls[j])) {
            balls[i].moveIntersectingBalls();
            // Maybe also add:
            balls[j].moveIntersectingBalls();
        }
    }
}
您可以在i而不是0处启动内部循环,因为您之前已经检查了这些


事实上,如果从0开始,您将检查每个球对两次,例如1,3,然后在3,1再次检查,这可能会导致您描述的抽搐。

要将每个球与所有其他球进行比较,您需要两个for循环:

for (int i = 0; i < balls.length; i++)
{
    for (int j = 0; j < balls.length; j++)
    {
        // Check first that you are not comparing a ball to itself.
        if (i != j)
            if (balls[i].intersect(balls[j]))
                balls[i].moveIntersectingBalls();
    }
}

将球[i]与球[i]进行比较,其中我同时是同一个数字-这意味着什么?好吧,你似乎已经注意到了这个问题,问题是我只能将每个球与它自己进行比较,这样它们就会不断相交。你能解释一下为什么你不能比较两个不同的球吗。。。它仍然需要球不与它们自己进行比较。是的,我尝试了这个,但是球与它们自己进行了比较,所以它仍然不起作用。我修改了代码并更正了它,你只需要确保我!=jj=i+1,否则检查j=iballs[j].移动交叉球;不起作用,因为当在第一个循环中检查j时,将在同一个球上第二次执行moveIntersectingBalls,它将取消第一次修改*-1Great!很高兴听到这个消息。我需要更多的代表来这样做,但我觉得我会更频繁地访问这个论坛,以积累更多。再次感谢。
for(int i = 0; i < balls.length; i++){
    for(int j = (i+1); j < balls.length; j++){
        if (balls[i].intersect(balls[j])) {
            balls[i].moveIntersectingBalls();
            // Maybe also add:
            balls[j].moveIntersectingBalls();
        }
    }
}
for (int i = 0; i < balls.length; i++)
{
    for (int j = 0; j < balls.length; j++)
    {
        // Check first that you are not comparing a ball to itself.
        if (i != j)
            if (balls[i].intersect(balls[j]))
                balls[i].moveIntersectingBalls();
    }
}