从arraylist中删除对象正在做一些奇怪的事情

时间:2015-07-21 13:44:59

标签: arraylist processing

在下面的代码中,我希望一旦球的年龄高于阈值,球就会从ArrayList ballList更改为另一个ArrayList oldBalls

这段代码应该非常简单但是我无法弄清楚为什么当年龄与阈值(不大)相同时它们会消失,然后它们会在2帧之后再回来。

我已经使用java中的ArrayLists的迭代器检查了相关问题,但我认为应该有一种方法可以在没有java的情况下进行处理。 此外,我似乎无法在处理论坛上发布任何问题,即使我可以登录,不知道为什么......

我已将代码减少到能够重现错误的最低限度。

ArrayList <Ball> ballList;
ArrayList <Ball> oldBalls;
int threshold=4;
PFont font;

void setup(){
 size(400,400);
 frameRate(0.5);
 font=createFont("Georgia", 18);
 textFont(font);
 textAlign(CENTER, CENTER);
 ballList=new ArrayList<Ball>();
 oldBalls=new ArrayList<Ball>();
 noFill();
 strokeWeight(2);
}

void draw(){
  background(0);
  Ball b=new Ball(new PVector(10, random(height/10,9*height/10)),new PVector(10,0),0);
  ballList.add(b);

  stroke(0,0,200);
  for(int i=0;i<oldBalls.size();i++){
    Ball bb=oldBalls.get(i);
    bb.update();
    bb.render();
    text(bb.age,bb.pos.x,bb.pos.y);
  }

  stroke(200,0,0);
  for(int i=0;i<ballList.size();i++){
    Ball bb=ballList.get(i);
    bb.update();
    bb.render();
    bb.migrate();
    text(bb.age,bb.pos.x,bb.pos.y);
  }
}

class Ball{
  PVector pos;
  PVector vel;
  int age;

  Ball(PVector _pos, PVector _vel, int _age){
    pos=_pos;
    vel=_vel;
    age=_age;
  }

  void migrate(){
    if(age>threshold){
      oldBalls.add(this);
      ballList.remove(this);
    }
  }

  void update(){
    pos.add(vel);
    age+=1;
  }

  void render(){
    ellipse(pos.x,pos.y,24,24);
  }
}

请注意标有age = threshold的球突然消失......

2 个答案:

答案 0 :(得分:3)

我猜问题就在这里:

for(int i=0;i<ballList.size();i++){
    Ball bb=ballList.get(i);
    bb.update();
    bb.render();
    //add this
    if(bb.migrate())
        i--;
    text(bb.age,bb.pos.x,bb.pos.y);
}

boolean migrate(){
    if(age>threshold){
      oldBalls.add(this);
      ballList.remove(this);
      //and this
      return true;
    }
    return false;
}

migrate()将从ballList中删除该对象,并将其大小减小1.

答案 1 :(得分:1)

这里发生的事情是因为你在迭代它们时改变了List。考虑一下你在这里的循环

  for(int i=0;i<ballList.size();i++){
    Ball bb=ballList.get(i);
    bb.update();
    bb.render();
    bb.migrate();
    text(bb.age,bb.pos.x,bb.pos.y);
  }

假设ballList在3岁时都有2个球,第一个循环得到球[0]然后将其从列表中移除,我将递增并且循环将立即退出,因为ballList.size()现在是1.所以它不是4岁时消失的球,而是随后的球。