Java跟JavaScript遍历删除数组或list指定项

有时候我们项目中会遇到这种需求:需要遍历一个数组或者list,然后将其中的某一个符合条件的一项或者多项删除。如果不注意,有时候还真会遇到点小麻烦。

JavaScript

如果按照正常的思维进行操作会怎么样呢?看下面↓

1
2
3
4
5
6
7
8
9
var 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);
}
}
console.log(arr);

运行结果:[2, 3, 5, 6, 8, 4, 3, 6]

很明显,只删除了一个5,出现这种情况的原因,是由于当i = 2的时候,删除了5,整个数组的长度发生了变化,所以下一次遍历arr[3] = 6,直接跳过了另一个5。

其实有很多方法可以解决这个问题,我一般使用两种方法:

  1. 倒着遍历:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var 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 ],完美解决!

  2. 遍历的时候,如果移除了某一项,循环值减1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
List<String> arr = new ArrayList<>();
arr.add("2");
arr.add("3");
arr.add("5");
arr.add("5");
arr.add("6");
arr.add("8");
arr.add("4");
arr.add("3");
arr.add("6");
for (String s : arr) {
if (s.equals("5")) {
arr.remove(s);
}
}
System.out.print(arr);
}
}

看起来没啥问题,那么运行一下

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Test01 {
public static void main(String[] args) {
List<String> arr = new ArrayList<>();
arr.add("2");
arr.add("3");
arr.add("5");
arr.add("5");
arr.add("6");
arr.add("8");
arr.add("4");
arr.add("3");
arr.add("6");
Iterator<String> it = arr.iterator();
while(it.hasNext()) {
if (it.next().equals("5")) {
it.remove();
}
}
System.out.print(arr);
}
}

运行结果:[2, 3, 6, 8, 4, 3, 6],OK,问题解决,各位晚安!

如果觉得本文对你有帮助,请支持我!