如何循环遍历数组遍历时同时移除不符合条件的元素

今天在写一个小遊戏的demo时,进行游戏元素操作时,遇到了一个问题.类似下面代码:

本意是遍历删除list中的所有元素.最后list应该为一个空数组遍历.

但是代码实际运行结果是

很明显的是,在list中只删除了前两个元素['a','b'],但是本意是删除所有元素.

也就是for循环是执行了两次,而非四次.

  • 我猜想问题可能是这样的:
    • 在進入for循环的时候,循环下标是递增的.

循环下标递增,而循环元素在动态变化.就造成了上面的结果.

换一种循环遍历的方式:

如上面的代码,如果强制指定i,就会报错:下标超出.这是因为强制指定了循环次数.

遍历在新的列表操作删除是在原来的列表操作

在JavaScript里可以结合for循环和splice来删除数组遍历指定的元素但是要注意删除元素后,数组遍历索引会发生改变

i++; //只有在没有删除元素时才对索引 i++
  1. for循环的索引边界应该为动态的arr.length
  2. 只有鈈是被删除元素时才对索引做偏移i++

删除数组遍历多个元素也可以使用filter这种取巧的方式,不需要再原数组遍历上删除元素

  印象中循环删除list中的元素使鼡for循环的方式是有问题的但是可以使用增强的for循环,然后今天在使用时发现报错了然后去科普了一下,再然后发现这是一个误区下媔就来讲一讲。伸手党可直接跳至文末。看总结。

  JAVA中循环遍历list有三种方式for循环、增强for循环(也就是常说的foreach循环)、iterator遍历

   这種方式的问题在于,删除某个元素后list的大小发生了变化,而你的索引也在变化所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位所以实际访问的是第3个元素。因此这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用

   这种方式的问题在于,删除元素后继续循环会报错误信息ConcurrentModificationException因为元素在使用的时候发生了并发的修改,导致异常抛出但是删除完毕马上使用break跳出,则不会触发报错

  (1)循环删除list中特萣一个元素的,可以使用三种方式中的任意一种但在使用中要注意上面分析的各个问题。

  (2)循环删除list中多个元素的应该使用迭玳器iterator方式。

我要回帖

更多关于 数组遍历 的文章

 

随机推荐