public static void main(String[] args) {
List<String> list = new ArrayList();
list.add("AA");list.add("Aw");list.add("Aw");list.add("AA");
list.add("AA");list.add("A45");list.add("AA");
list.add("Aal");list.add("Af");list.add("An");
System.out.println(list);
for(int i=0;i<list.size();i++){
if(list.get(i).equals("AA")){
list.remove(i);
}
}
System.out.println(list);
}
我目前正在尝试删除ArrayList中具有值"AA"
的所有元素,但是,它只删除其中的一些而不是全部。任何人都可以向我解释我做错了什么?
元素:
[AA, Aw, Aw, AA, AA, A45, AA, Aal, Af, An]
在我尝试删除所有值为"AA"
的字符串后输出。
[Aw, Aw, AA, A45, Aal, Af, An]
为什么AA
仍在输出列表中?
答案 0 :(得分:5)
这是错误的:
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("AA")) {
list.remove(i);
}
}
因为只要删除元素,您的列表就会改变其大小....
你需要一个迭代器:
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
if (iter.next().equals("AA")) {
iter.remove();
}
}
使用java8:
List<String> newFilteredList = list.stream().filter(i -> !i.equals("AA")).collect(Collectors.toList());
System.out.println(newFilteredList);
答案 1 :(得分:3)
您在迭代时跳过项目。
当您致电list.remove(i)
时,所有元素都会向左移动。因此,如果您在索引3处删除项目,则先前在索引4处的项目将转换为索引3.但是,您仍在为下一个循环递增i
,因此跳过检查条目。
答案 2 :(得分:0)
如果使用Iterator,则可以删除循环中的当前项。 看看这里:Why do we need to use iterator on ArrayList in Java?
答案 3 :(得分:0)
当您删除元素时,列表的大小会发生变化,即随着越来越多的元素被删除,列表中的元素会向左移动。
从列表中删除所有重复的"AA"
的替代方法是使用Stream#filter
方法保留所有不具有"AA"
值的元素。
System.out.println(list.stream().filter(s -> !s.equals("AA")).collect(Collectors.toList()));
答案 4 :(得分:0)
当项目被删除时,项目的索引在数组列表中移动,因此迭代不正确。每当你的检查员发现&#34; AA&#34;。你需要重新开始循环。
答案 5 :(得分:0)
当i = 3时,你的for循环会跳过第5个元素。要绕过此操作,请使用以下代码:
{{1}}
这给了我正确的输出:
[AA,Aw,Aw,AA,AA,A45,AA,Aal,Af,An] [Aw,Aw,A45,Aal,Af,An]
答案 6 :(得分:0)
如果您正在使用Java 8,removeIf
上的Collection
方法需要Predicate
,因此您可以按如下方式编写代码:
list.removeIf(each -> each.equals("AA"));
如果查看此方法的实现,您会看到它使用Iterator
并为满足给定Predicate
的每个元素调用remove。