遇到问题
在做卡牌游戏开发过程中,回合结束时,场上随从会依次发动【回合结束时】能力。
但是有的能力可以破坏场上其他随从!
就造成了一个经典问题:在循环一个List的时候,如果希望移除某元素要怎么办?
查找资料
网上找到了很多方案
- 最简单的removeIf
- 最麻烦的迭代器Iterable
- 最in的stream().spliterator().tryAdvance()方法
但是我试了试,前两种都是只能删除“当前循环的对象”,而第三种连删除当前对象都做不到
其实这个现象想一想还是很合理的:循环途中,是没法控制非当前迭代对象的。
那么该怎么办
而这个需求其实根本上不是以代码上循环场上随从来解决的。
就是说不是循环当前的场上随从,而是循环回合结束瞬间场上随从的快照
我们再看看需求:
场上随从会依次发动【回合结束时】能力
看到后我的直接理解是:
list = 场上随从
list.forEach(iter ->iter.回合结束时)
但是其实应该这么理解:
list = new ArrayList<>(场上随从)
list.forEach(iter ->{
if(iter在场) iter.回合结束时
})
也就是说,这个迭代不要依赖java里面的任何关键字或者方法。先实例化一个新的list,再靠while循环自己弄。
结论
想在循环list的时候remove任何一个元素,就不要操作原数组。
最重要的是在目标list上实例化一个新list,再对这个新list进行循环。
对于需求的理解上,需求中的一个数据,如果不是很有经验的产品,要的是数据在某个时间的快照往往是程序员需要追问出来的信息。
(回合结束瞬间在场上的)随从会依次(如果在场上则)发动【回合结束时】能力。