一,for循环使用remove()删除坐标来删除元素。 问题现象:循环的时候被删除元素的下个元素不能读取到。代码现象如下:
List<String> testList1 = new ArrayList<String>();//全部元素集合 test0……test6 for (int i = 0; i < 6; i++) { testList1.add("test"+i); } List<String> testList2 = new ArrayList<String>();//部分元素集合 test2 test3 test4 test5 for (int i = 2; i < 6; i++) { testList2.add("test"+i); } //现在要删除testList1 中包含testList2中的元素 System.out.PRintln("testList1原集合元素:"); for (int i = 0; i < testList1.size(); i++) { System.out.println(" "+testList1.get(i)); } for (int i = 0; i < testList1.size(); i++) { if(testList2.contains(testList1.get(i))){ testList1.remove(i); } } System.out.println("testList1删除testList2中的元素后:"); for (int i = 0; i < testList1.size(); i++) { System.out.println(" "+testList1.get(i)); }结果如下: testList1原集合元素: test0 test1 test2 test3 test4 test5 testList1删除testList2中的元素后: test0 test1 test3 test5 testList1 中test3和test5元素未被删除。是test2这个对象被删除了,test2后边的元素对应的向前移动一位,对应的索引index也减1,因此在删除test2时对应的的i=2,删除之后i++,而test3对应的索引变成了由3变成2,所以实际上test3没有读取到,对应的test5一样道理。 解决办法,只需要在testList1.remove(i);之后加i–即可。让元素删除之后index回到删除之前的大小。 假如您不是按顺序每次读取一个元素而是隔n个读,还是加个i–即可,因为移除一个元素其index总是减一。 二,三种迭代删除会出现以下异常: JException in thread “main” java.util.ConcurrentModificationException at java.util.AbstractList
这种情况是因为导致List的next()方法内部出现modCount和expectedModCount不一致导致抛出异常。,可直接修改util包中的源代码解决这类问题,或者直接采用iterator.remove();解决问题
for (Iterator it = myList.iterator(); it.hasNext();) { String value = it.next(); if (value.equals( "3")) { it.remove(); } }新闻热点
疑难解答