Изменение значений объекта ArrayList из другого класса

У меня есть два класса: класс Creature, который содержит boray ArrayList, и класс Food. Боиды имеют несколько параметров:

 Creature(float posX, float posY, int t, int bth, int ah) {
    location = new PVector(posX, posY);
    vel = new PVector(random(-5,5), random(-5, 5));
    acc = new PVector();
    type = t;
    if (t == 1) { btype = bth; }
    else { health = bth; }
    if (t == 1) { age = ah; }
    else { hunger = ah; }
    wdelta = 0.0;
    action = 0;
    if (btype == 1) { mass = 5.0; }
    else { mass = 7.0; }
  }

Класс еды имеет такой метод:

  void foodtime(ArrayList boids) {
    for (int i = 0; i < boids.size(); i++) {
      Creature boid = (Creature) boids.get(i);
      float distance = PVector.dist(location, boid.location);
      if (distance < 0.5) {
        bnumadj = i;
        count++;
        if (count == quantity) {
          planet.food.remove(this);
          count = 0;
          bnumadj = -1;
        }
      }
    }
  }

То, чего я пытаюсь добиться, это то, что если boid "съедает" еду, то тип boid (btype) меняется с 2 на 1.

Я пытаюсь использовать переменную bnumadj, чтобы передать ее boid в этом методе:

  void boid(ArrayList boids) {
    for (int i = 0; i < boids.size(); i++) {
      if (i == bnumadj) {
        this.btype = 1;
        bnumadj = -1;
      }
    }
  }

Куда я иду не так?

1 ответ

Решение

Это кажется очень запутанным способом сделать это, поэтому я не удивлен, что у вас есть проблемы. Вы сравниваете значения с индексами, что не имеет для меня большого смысла.

Вместо этого попробуйте использовать простой вложенный цикл, чтобы делать то, что вы хотите. Вы можете использовать Iterator чтобы было проще удалять элементы во время итерации.

ArrayList<Creature> boids = new ArrayList<Creature>();
ArrayList<Food> food = new ArrayList<Food>();
//populate ArrayLists

void draw(){

   for(Creature boid : boids){
      Iterator<Food> foodIter = food.iterator();

      while(foodIter.hasNext()){
         Food f = foodIter.next();
         float distance = PVector.dist(boid.location, food.location);
         if (distance < 0.5) {
            boid.btype = 1;
            foodIter.remove(); //removes the food
        }
      }

   }

   //draw the scene
}

Я полагаю, вы можете переместить вторую итерацию, используя Iterator внутри Creature типа, но основная идея заключается в следующем: сделать это простым с помощью Iterator удалить Food вместо того, чтобы пытаться сопоставить индексы.

Другие вопросы по тегам