在循环中删除集合中的元素(Java)
注:本人编程菜鸟,只是把编程过程中遇到的问题和想到的解决方案分享出来……
通过一个示例来说明:在一个list从存放了0~14这些数字,要把其中在[6,10]去区间内的数字删除
使用循环+索引
错误的方式
import java.util.ArrayList; import java.util.List; /** * Created by pokerface_lx on 16/8/6. */ public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 15; i++) { list.add(i); } for (int i = 0; i < list.size(); ++i) { if (list.get(i) >=5 &&list.get(i)<=10) { list.remove(i); } } System.out.println(list); } }
分析:结果并不是预期的结果,这是因为在remove元素的过程中,后面元素的索引也会相应的-1,比如把5这个元素remove掉,下一个元素的索引变成了5之前的索引,i继续递增就会导致该下一个元素会被跳过
正确的方式
在remove元素之后要把索引-1
import java.util.ArrayList; import java.util.List; /** * Created by pokerface_lx on 16/8/6. */ public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 15; i++) { list.add(i); } for (int i = 0; i < list.size(); ++i) { if (list.get(i) >=5 &&list.get(i)<=10) { list.remove(i); --i; } } System.out.println(list) } }
结果: [0, 1, 2, 3, 4, 6, 8, 10, 11, 12, 13, 14]
使用for-each
错误的方式
import java.util.ArrayList; import java.util.List; /** * Created by pokerface_lx on 16/8/6. */ public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 15; i++) { list.add(i); } for (Integer i : list) { if (i >= 5 && i <= 10) { list.remove(i); } } System.out.println(list); } }
结果: 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)
结果抛出了异常,意思是不允许多线程的调用
Java中for-each实际上使用的是Iterator进行处理的,而Iterator是不允许集合在Iterator使用期间删除的
正确的方式
使用Iterator进行迭代,并调用Iterator的remove()方法
import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Created by pokerface_lx on 16/8/6. */ public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 15; i++) { list.add(i); } Iterator iterator = list.iterator(); while (iterator.hasNext()) { int num = (int) iterator.next(); if (num >= 5 && num <= 10) { iterator.remove(); } } System.out.println(list); } }