gpt4 book ai didi

java - 循环时如何确保可变数组中的下一项确实是下一项?

转载 作者:行者123 更新时间:2023-11-29 06:42:36 26 4
gpt4 key购买 nike

它一定很基础,但我需要帮助。例如,你将怪物信息存储在一个数组中,并执行 for~loop 让每个怪物轮流攻击/移动,就像这样

for( i <- 0 to monsters.length-1) monsters(i).act 

然后一些怪物在循环过程中死亡,你必须在循环仍在进行时删除数组中的一些元素。那么数组中的下一项可能不是您真正要处理的下一项。

是否有任何快速/智能的方法来确保数组中的每个项目在循环中执行一次且仅执行一次,即使您真的必须在循环期间更改数组?

最佳答案

Scala 的集合通常不会假定您会在使用 foreach 之类的方法(或执行 for 循环)时操作它们。如果您想以这种方式做事,最容易使用的类是 Java 的 java.util.concurrent.ConcurrentSkipListMap

// This helps you use Java collections like Scala ones
import collection.JavaConversions._

case class Monster(name: String, hp: Int) {}
val horde = new java.util.concurrent.ConcurrentSkipListMap[Int,Monster]

horde put (0, Monster("wolf",7))
horde put (1, Monster("orc",3))

for (h <- horde) println(h) // Prints out both

Iterator.iterate(Option(horde.firstEntry)) {
case None => None
case Some(e) =>
val m = e.getValue
if (m.name=="wolf") horde.remove(1) // Kill the orc
else if (m.name=="orc") horde.remove(0) // Kill the wolf
Option(horde.higherEntry(e.getKey))
}.takeWhile(_.isDefined).foreach(_=>())

for (h <- horde) println(h) // Prints out just the wolf

现在,当然,这是一团糟,但它确实有效,而且它可以很好地随机访问你的怪物。您必须以合理的顺序维护 key ,但这并不难。

或者,正如其他人所指出的,您可以添加一个 isAliveisDead 方法,并且只对活着的怪物起作用。然后,在你通过列表​​一次后,你 .filter(_.isAlive) 扔掉所有死去的怪物(或 .filter(! _.isDead)),然后再次运行。

关于java - 循环时如何确保可变数组中的下一项确实是下一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9744049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com