Arraylist无法删除重复的字符串

时间:2017-04-27 13:14:39

标签: java arraylist collections

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"的所有元素,但是,它只删除其中的一些而不是全部。任何人都可以向我解释我做错了什么?

arraylist中的

元素:

[AA, Aw, Aw, AA, AA, A45, AA, Aal, Af, An]
在我尝试删除所有值为"AA"的字符串后输出

[Aw, Aw, AA, A45, Aal, Af, An]

为什么AA仍在输出列表中?

7 个答案:

答案 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。