有时候我们项目中会遇到这种需求:需要遍历一个数组或者list,然后将其中的某一个符合条件的一项或者多项删除。如果不注意,有时候还真会遇到点小麻烦。
JavaScript
如果按照正常的思维进行操作会怎么样呢?看下面↓
1 | var arr = [2,3,5,5,6,8,4,3,6]; |
运行结果:[2, 3, 5, 6, 8, 4, 3, 6]
很明显,只删除了一个5,出现这种情况的原因,是由于当i = 2
的时候,删除了5,整个数组的长度发生了变化,所以下一次遍历arr[3] = 6
,直接跳过了另一个5。
其实有很多方法可以解决这个问题,我一般使用两种方法:
倒着遍历:
1
2
3
4
5
6
7
8
9var arr = [2,3,5,5,6,8,4,3,6];
for (var i = arr.length - 1; i >= 0; i--) {
if (arr[i] == 5) {
arr.splice(i,1);
}
}
console.log(arr);运行结果:
[ 2, 3, 6, 8, 4, 3, 6 ]
,完美解决!遍历的时候,如果移除了某一项,循环值减1:
1
2
3
4
5
6
7
8
9
10var arr = [2,3,5,5,6,8,4,3,6];
for (var i = 0; i < arr.length; i++) {
if (arr[i] == 5) {
arr.splice(i,1);
i--;
}
}
console.log(arr);运行结果:
[ 2, 3, 6, 8, 4, 3, 6 ]
,一样可以解决问题。
Java
java中大多数时间操作的是集合,先看一段代码:
1 | import java.util.ArrayList; |
看起来没啥问题,那么运行一下
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.zhangym.Test01.main(Test01.java:20)
经典的ConcurrentModificationException
异常,其实看看源码就知道了,由于遍历的时候集合长度发生了变化,抛出了这个异常。
解决办法就是用Iterator:
1 | public class Test01 { |
运行结果:[2, 3, 6, 8, 4, 3, 6]
,OK,问题解决,各位晚安!