【问题标题】:Removing element from ArrayList every 500 frames每 500 帧从 ArrayList 中删除元素
【发布时间】:2025-12-23 14:30:16
【问题描述】:

我有这个数组列表:

// 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)
}

【问题讨论】:

  • 您想从列表中删除 1 项还是删除 arraylist 中的所有内容?
  • 什么是框架?每 500 帧是多少?没听说过这个词...
  • @user3659052 每次程序执行 500 帧时,只是数组列表中的最后一项。
  • @RANders00 在处理 3.0.1 中,您可以使用 'frameCount' 计算每帧的计数。
  • 哦,现在我明白了,您可能应该包括您在谈论 video 帧!

标签: java arraylist processing


【解决方案1】:

如果您已经有一个变量来跟踪您所在的帧,您可以使用以下 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 的 remove 方法的参数,我也这样做了,但请注意,这将始终删除 arrayList 中的第二个对象,因为 arrayList 索引从 0 开始计数。

这只会在每次帧数是 500 的倍数时运行。

如果您尚未跟踪 frameCount,则必须将 frameCount++ 放入每帧执行的循环中。

【讨论】:

  • 元素的一半是什么意思?如果您只包括第二个食肉动物.remove 行,它应该只删除最后一个元素。所以每 500 帧应该从列表中删除一个捕食者。这不是正在发生的事情吗?
  • 您是否在 remove() 调用之后立即使用 print 语句查看列表的大小?这样你就可以看到“bug”是在 remove() 方法中还是在 if 语句评估为 true 的次数中。
  • @JonathanLaliberte 听起来你在遍历整个数组的 for 循环中有这个 if 语句,在这种情况下,它将删除一个元素,前进一个元素,删除一个元素,前进一个元素……以此类推,直到最后。这将导致删除一半数组的行为。要解决此问题,请不要将 if 语句用于删除 for 循环内的内容
  • @JonathanLaliberte 这很可能是问题所在,澄清一下,这是因为 for 循环几乎每帧一次执行,所以如果每一帧都循环 for 循环,并且在 for loop 是我在上面提供的 if 语句,整个 for 循环的 frameCount 将是相同的,从而导致像 phflack 指出的那样多次删除。
  • 无法表达我对这里出色的 cmets 的感激之情。收集了大量有用的信息。荣誉。感谢大家花时间在这里帮助别人!现在终于搞定了:D
【解决方案2】:

draw() 函数每秒调用 60 次,这就是您将使用的循环。每次调用 draw() 时,frameCount 变量都会自动递增。

就像 The Coding Wombat 所说,您可以使用 the modulo operator 来确定变量(如 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
}

【讨论】:

  • Doesn't remove(0) 删除数组列表的第一个索引,而不是像提问者要求的那样删除最后一个索引?
  • @TheCodingWombat 不错。已编辑。顺便说一句,您的答案是正确的,但我添加的答案更具体到处理。
  • 我现在才意识到标签处理实际上是一种编程语言/框架的名称,而不是他的意思是他正在处理数组列表
  • @TheCodingWombat 是的,这是一个非常令人困惑的语言名称。大多数处理问题也用 Java 标记也无济于事!