Удаление элемента из ArrayList каждые 500 кадров

У меня есть этот массив:

// Add predators
predators = new ArrayList();
for (int i = 0; i < predNum; i++) {
  Creature predator = new Creature(random(width), random(height), 2);
  predators.add(predator);
}

Как можно структурировать оператор так, чтобы последний элемент из массива predators удалялся каждые 500 кадров? Нужна ли ему какая-то петля?

if (frameCount == 500){
 predators.remove(1)
}

person Jonathan Laliberte    schedule 20.01.2016    source источник
comment
вы хотите удалить 1 элемент из списка или удалить все в массиве?   -  person logger    schedule 20.01.2016
comment
Что такое кадр? Что такое каждые 500 кадров? Никогда не слышал о таком термине...   -  person RAnders00    schedule 20.01.2016
comment
@user3659052 user3659052 просто последний элемент в списке массивов каждый раз, когда программа выполняет 500 кадров.   -  person Jonathan Laliberte    schedule 20.01.2016
comment
@ RAnders00 в Processing 3.0.1 вы можете подсчитывать каждый кадр с помощью «frameCount».   -  person Jonathan Laliberte    schedule 20.01.2016
comment
О, теперь я понимаю, вы, наверное, должны были включить, что вы говорите о кадрах видео!   -  person RAnders00    schedule 20.01.2016
comment
@ RAnders00 Не совсем так. Этот вопрос касается языка обработки, который дает вам функцию draw(), которая автоматически вызывается 60 раз в секунду. Каждый вызов draw() считается фреймом, и вы можете рисовать что-либо на экране, что упрощает создание интерактивных визуализаций без использования шаблонов Java.   -  person Kevin Workman    schedule 20.01.2016


Ответы (2)


Если у вас уже есть переменная, которая отслеживает, в каком кадре вы находитесь, вы можете использовать этот оператор if:

if (frameCount % 500 == 0) {
   predators.remove(1); //use this if you want to remove whatever is at index 1 every 500 frames
   predators.remove(predators.size() -1); //use this if you want to remove the last item in the ArrayList
}

Поскольку вы использовали 1 в качестве аргумента для метода удаления ArrayList, я тоже это сделал, но обратите внимание, что это всегда будет удалять 2-й объект в arrayList, поскольку индексы arrayList начинают отсчет с 0.

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

Если вы еще не отслеживаете frameCount, вам придется поместить frameCount++ в цикл, который выполняется в каждом кадре.

person The Coding Wombat    schedule 20.01.2016
comment
Потрясающе, это почти то, что я искал. Большое спасибо. Есть идеи, почему может быть удалена половина элементов в arraylist, а не только 1 элемент? - person Jonathan Laliberte; 20.01.2016
comment
Что вы подразумеваете под половиной элементов? Если вы включите только вторую строку хищников.remove, она должна удалить только последний элемент. Таким образом, каждые 500 кадров один хищник должен быть удален из списка. Разве это не то, что происходит? - person The Coding Wombat; 20.01.2016
comment
Неа. Где-то должна быть ошибка, тогда оба предложенных вами метода были опробованы. Когда я делаю второй метод, я получаю вывод: 5 2 1 0 (количество оставшихся элементов, каждая итерация) - person Jonathan Laliberte; 20.01.2016
comment
Вы ставите оператор печати, чтобы увидеть размер списка сразу после вызова remove()? таким образом вы можете увидеть, находится ли ошибка в методе remove() или в количестве раз, когда оператор if оценивается как true. - person The Coding Wombat; 20.01.2016
comment
@JonathanLaliberte Похоже, у вас есть этот оператор if внутри цикла for, проходящего через весь массив, и в этом случае он удалит элемент, перейдет к элементу, удалит элемент, перейдет к элементу ... и так далее, пока не конец. Это приведет к удалению половины массива. Чтобы решить эту проблему, не помещайте оператор if для удаления элементов внутри цикла for. - person phflack; 20.01.2016
comment
@JonathanLaliberte Это вполне может быть проблемой, чтобы уточнить, это потому, что цикл for выполняется почти сразу каждый кадр, поэтому, если каждый кадр цикл for зацикливается, а внутри цикла for находится оператор if, который я предоставил выше , значение frameCount будет одинаковым для всего цикла for, что приведет к множественным удалениям, как указал phflack. - person The Coding Wombat; 20.01.2016
comment
Не могу выразить, насколько я благодарен за большой набор комментариев здесь. Собрал тонну полезной информации. Престижность. Спасибо всем за то, что потратили здесь немного времени, чтобы помочь кому-то! Наконец-то все заработало :D - person Jonathan Laliberte; 20.01.2016

Функция draw() вызывается 60 раз в секунду, так что это цикл, который вы будете использовать. Переменная frameCount автоматически увеличивается при каждом вызове draw().

Как сказано в The Coding Wombat, вы можете использовать оператор по модулю, чтобы определить, когда переменная (например, frameCount) кратно значению (например, 500).

Вы можете комбинировать эти идеи, чтобы сделать что-то раз в 500 кадров:

ArrayList<Creature> predators = new ArrayList<Creature>();

void setup(){
  for (int i = 0; i < predNum; i++) {
    Creature predator = new Creature(random(width), random(height), 2);
    predators.add(predator);
  }
}

void draw(){
  if (frameCount % 500 == 0){
   predators.remove(predators.size()-1);
  }

  //draw your frame
}
person Kevin Workman    schedule 20.01.2016
comment
Не удаляет ли remove (0) первый индекс массива вместо последнего, как просил спрашивающий? - person The Coding Wombat; 20.01.2016
comment
@TheCodingWombat Хороший улов. Отредактировано. Кстати, ваш ответ правильный, но я добавил свой ответ, чтобы он был более конкретным для обработки. - person Kevin Workman; 20.01.2016
comment
Я только сейчас понимаю, что обработка тегов на самом деле является названием языка/фреймворка программирования, а не им, что означает, что он обрабатывал массив - person The Coding Wombat; 20.01.2016
comment
@TheCodingWombat Да, это довольно запутанное название для языка. Не помогает и то, что большинство вопросов Processing также помечены тегом Java! - person Kevin Workman; 20.01.2016