我犯了一个非常基础的错误:在对List的循环中改变了List

遇到问题

在做卡牌游戏开发过程中,回合结束时,场上随从会依次发动【回合结束时】能力。
但是有的能力可以破坏场上其他随从

就造成了一个经典问题:在循环一个List的时候,如果希望移除某元素要怎么办?

查找资料

网上找到了很多方案

  1. 最简单的removeIf
  2. 最麻烦的迭代器Iterable
  3. 最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进行循环。

对于需求的理解上,需求中的一个数据,如果不是很有经验的产品,要的是数据在某个时间的快照往往是程序员需要追问出来的信息。

(回合结束瞬间在场上的)随从会依次(如果在场上则)发动【回合结束时】能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值