美文网首页
如何在遍历容器的同时移除其中的元素呢?

如何在遍历容器的同时移除其中的元素呢?

作者: 风亡小窝 | 来源:发表于2017-09-21 17:12 被阅读7次
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
for (int i = 0; i < list.size(); i++) {
    list.remove(i);
    System.out.println(list);
}
[2, 3, 4, 5]
[2, 4, 5]
[2, 4]

上述代码存在的问题:当移除索引为 i 的元素后,原索引为 i+1 的元素的索引变为 i ,接下来遍历索引为 i+1 的元素时,原索引为 i+1 的元素被跳过。


那么要如何在遍历容器的同时移除其中的元素呢?

答案是使用容器的迭代器,迭代器有一个remove方法可以满足我们的需求。

List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
    iter.next();
    iter.remove();
    System.out.println(list);
}
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]

需要注意的是在使用迭代器遍历容器时,不能使用容器自身新的迭代器的方法进行添加删除,否则会抛出 ConcurrentModificationException。如下:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
for (Integer item : list) {
    list.remove(1); // 或则 list.add
    System.out.println(list);
}
[1, 3, 4, 5]
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at test.Test.main(Test.java:50)

相关文章

网友评论

      本文标题:如何在遍历容器的同时移除其中的元素呢?

      本文链接:https://www.haomeiwen.com/subject/pzctextx.html