集合类的删除方法
- 最近做的业务遇到一个排名的需求.在remove的时候,数据出来的意志有问题.逻辑检查好几遍都没问题.debug之后,才找出这个问题.看示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13List<Integer> pp = new ArrayList<>() ;
pp.add(1) ;
pp.add(2) ;
pp.add(3) ;
pp.add(4) ;
for (int i = 0; i < pp.size(); i++) {
Integer integer = pp.get(i);
System.out.println("当前遍历i:" + i + "对应集合数据:" + integer);
if (integer.equals(3)){
pp.remove(i) ;
}
}
输出:1
2
3
4
5当前遍历i:0对应集合数据:1
当前遍历i:1对应集合数据:2
当前遍历i:2对应集合数据:3
Process finished with exit code 0
why?数据4去了哪里?
这其实是remove之后,size会立即变化.但是遍历的指针却并没有做出相应的变化.依旧是自增了一下.也就是说,当i = 2的时候,remove方法执行.然后对应的size变化为3.这时候i++变为了3<3不成立,不再循环,跳出循环.但实际上,并没有循环完成.因为还有一个数据没循环到.也就是i=2现在是新的数据了. 如何避免?="" 我是这样处理的.=""
3不成立,不再循环,跳出循环.但实际上,并没有循环完成.因为还有一个数据没循环到.也就是i=2现在是新的数据了.>1
2
3
4
5
6
7
8
9
10
11
12
13
14List<Integer> pp = new ArrayList<>() ;
pp.add(1) ;
pp.add(2) ;
pp.add(3) ;
pp.add(4) ;
for (int i = 0; i < pp.size(); i++) {
Integer integer = pp.get(i);
System.out.println("当前遍历i:" + i + "对应集合数据:" + integer);
if (integer.equals(3)){
pp.remove(i);
i--;
}
}
输出结果:1
2
3
4
5
6当前遍历i:0对应集合数据:1
当前遍历i:1对应集合数据:2
当前遍历i:2对应集合数据:3
当前遍历i:2对应集合数据:4
Process finished with exit code 0