首页 > 编程语言 > 详细

Java中使用for循环删除集合中元素需要注意的点

时间:2019-07-03 10:53:20      阅读:117      评论:0      收藏:0      [点我收藏+]

删除集合中的元素,第一反应是遍历集合,比较找到相应的元素然后删除。遍历集合最容易想到的是for循环。

删除集合中为3的元素:

 1 List<Integer> list = new ArrayList<Integer>();
 2         for(int i = 0;i<10;i++){
 3             list.add(i);
 4         }
 5         for(int i = 0;i<10;i++){
 6             list.add(i);
 7         }
 8         System.out.println("删除前"+list);
 9         System.out.println("size:"+list.size());
10         for(int i = 0;i<list.size();i++){
11             if(list.get(i)==3){
12                 list.remove(i);
13             }
14         }
15         System.out.println("删除后"+list);
16         System.out.println("size:"+list.size());

运行结果:

删除前[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
size:20
删除后[0, 1, 2, 4, 5, 6, 7, 8, 9, 0, 1, 2, 4, 5, 6, 7, 8, 9]
size:18

 看起来一点问题也没有,那么我们把集合中元素的顺序换一下。

 1 List<Integer> list = new ArrayList<Integer>();
 2         for(int i = 0;i<10;i++){
 3             list.add(i);
 4             list.add(i);
 5         }
 6         System.out.println("删除前"+list);
 7         System.out.println("size:"+list.size());
 8         for(int i = 0;i<list.size();i++){
 9             if(list.get(i)==3){
10                 list.remove(i);
11             }
12         }
13         System.out.println("删除后"+list);
14         System.out.println("size:"+list.size());

运行结果:

删除前[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
size:20
删除后[0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
size:19

问题出现了,当删除相邻两个重复元素的时候,只删除一个,这是什么原因呢?

ArrayList的底层结构是数组类型,数组的特点是删除某个元素时,后面所有元素的索引都会往前移,而此时for循环的指针是却是向下移动的。

 技术分享图片

解决方案一:使用每次删除元素的时候,将for循环指针回调一次

 1 List<Integer> list = new ArrayList<Integer>();
 2         for(int i = 0;i<10;i++){
 3             list.add(i);
 4             list.add(i);
 5         }
 6         System.out.println("删除前"+list);
 7         System.out.println("size:"+list.size());
 8         for(int i = 0;i<list.size();i++){
 9             if(list.get(i)==3){
10                 list.remove(i);
11                 i--;
12             }
13         }
14         System.out.println("删除后"+list);
15         System.out.println("size:"+list.size());

运行结果:

删除前[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
size:20
删除后[0, 0, 1, 1, 2, 2, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
size:18

解决方案二:使用迭代器

 1     List<Integer> list = new ArrayList<Integer>();
 2         for(int i = 0;i<10;i++){
 3             list.add(i);
 4             list.add(i);
 5         }
 6         System.out.println("删除前"+list);
 7         System.out.println("size:"+list.size());
 8         Iterator<Integer> it = list.iterator();
 9         while(it.hasNext()){
10             if(3==it.next()){
11                 it.remove();
12             }
13         }
14         System.out.println("删除后"+list);
15         System.out.println("size:"+list.size());

运行结果:

删除前[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
size:20
删除后[0, 0, 1, 1, 2, 2, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
size:18

 

Java中使用for循环删除集合中元素需要注意的点

原文:https://www.cnblogs.com/CSC20190701/p/11124977.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!