我正在看这段代码:
Iterator<String> itr = list1.iterator();
while(itr.hasNext()) {
if(list2.contains(itr.next()))
itr.remove();
}
list1:a b c d list2:b c list1变成:a d
arraylist代码(不起作用)
for(int i = 0; i < list1.size(); i++) {
if(list2.contains(list1.get(i))
list1.remove(i);
}
似乎iterator的remove方法与arraylist的不同,它会将每个后续元素移到左边,这样就不可能迭代和删除(如果你想删除的东西连续出现,它会错过它,我相信)。看文档并没有为我清除它。
谢谢你!答案 0 :(得分:2)
迭代器的remove
方法和ArrayList
的{{1}}方法都将元素移到左侧。不同之处在于,当您使用迭代器的remove
方法时,迭代器remove
中的代码知道如何解决问题,以便迭代器不会跳过任何元素。当您使用自己的整数索引并自己执行remove
时,您必须自己管理整数索引。也就是说,你必须要知道,当元素被移动时,你需要修改索引,这样它就不会跳过任何元素。
例如,这将起作用:
remove
虽然我不喜欢在for(int i = 0; i < list1.size(); i++) {
if(list2.contains(list1.get(i)) {
list1.remove(i);
i--;
}
}
循环中修改这样的索引变量的做法;因此,我只使用for
循环代替:
while
但这是一个风格问题。
基本上,我认为迭代器的int i = 0;
while (i < list1.size()) {
if(list2.contains(list1.get(i)) {
list1.remove(i);
} else {
i++;
}
}
方法做了类似的事情 - 即。它调用ArrayList remove
,然后将索引备份为1。但是,我还没有看到实际来源。