【问题标题】:Arraylist not able to remove duplicate stringsArraylist 无法删除重复的字符串
【发布时间】:2017-09-25 07:39:40
【问题描述】:
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 还在输出列表中?

【问题讨论】:

标签: java arraylist collections


【解决方案1】:

如果您使用迭代器,则可以删除循环中的当前项。 看这里:Why do we need to use iterator on ArrayList in Java?

【讨论】:

    【解决方案2】:

    您在迭代时正在跳过项目。

    当您调用list.remove(i) 时,所有元素都向左移动。因此,如果您删除索引 3 处的项目,则先前位于索引 4 的项目将转移到索引 3。但是,您仍在为下一个循环递增 i,从而跳过检查条目。

    【讨论】:

      【解决方案3】:

      这是错误的:

       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);
      

      【讨论】:

        【解决方案4】:

        随着您移除元素,列表的大小会发生变化,即随着越来越多的元素被移除,列表中的元素会向左移动。

        从列表中删除所有重复的"AA" 的替代方法是使用Stream#filter 方法保留所有不具有"AA" 值的元素。

        System.out.println(list.stream().filter(s -> !s.equals("AA")).collect(Collectors.toList()));
        

        【讨论】:

          【解决方案5】:

          当项目被删除时,项目的索引在数组列表中移动,因此迭代不正确。每次您的检查器找到“AA”时。您需要重新开始循环。

          【讨论】:

            【解决方案6】:

            当 i=3 时,您的 for 循环会跳过第 5 个元素。要绕过这个,请使用以下代码:

            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);
            List newList = new ArrayList();
            for(int i=0;i<list.size();i++){
                String tempStr = list.get(i);
                if(!("AA").equals(tempStr)){
                     newList.add(tempStr);
                 }
             }
             System.out.println(newList);
            

            这给了我正确的输出:

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

            【讨论】:

              【解决方案7】:

              如果您使用的是 Java 8,Collection 上有一个 removeIf 方法,它采用 Predicate,因此您可以编写如下代码:

              list.removeIf(each -> each.equals("AA"));
              

              如果您查看此方法的实现,您会发现它使用Iterator 并为满足给定Predicate 的每个元素调用remove。

              【讨论】:

                猜你喜欢
                • 2017-09-12
                • 2016-07-09
                • 2016-01-19
                • 2019-11-16
                • 2017-12-17
                • 1970-01-01
                • 2020-03-30
                • 2013-11-12
                • 1970-01-01
                相关资源
                最近更新 更多