【问题标题】:Removing duplicate elements from a List从列表中删除重复元素
【发布时间】:2012-05-09 09:20:33
【问题描述】:

我已经开发了一个数组列表。

ArrayList<String> list = new ArrayList<String>();

list.add("1");
list.add("2");
list.add("3");
list.add("3");
list.add("5");
list.add("6");
list.add("7");
list.add("7");
list.add("1");
list.add("10");
list.add("2");
list.add("12");

但如上所示,它包含许多重复的元素。我想从该列表中删除所有重复项。为此,我认为首先我需要将列表转换为集合。

Java 是否提供将列表转换为集合的功能?是否有其他工具可以从列表中删除重复项?

【问题讨论】:

标签: java list duplicates


【解决方案1】:

您可以通过以下方式转换为 Set:

Set<String> aSet = new HashSet<String>(list);

或者您可以转换为集合并返回列表:

list = new ArrayList<String>(new HashSet<String>(list));

然而,这两者都不太可能保持元素的顺序。为了保持顺序,您可以在迭代时使用HashSet 作为辅助结构:

List<String> list2 = new ArrayList<String>();
HashSet<String> lookup = new HashSet<String>();
for (String item : list) {
    if (lookup.add(item)) {
        // Set.add returns false if item is already in the set
        list2.add(item);
    }
}
list = list2;

在重复的情况下,只有第一次出现在结果中。如果您只想出现最后一次出现,那将是一个更棘手的问题。我会通过反转输入列表,应用上述内容,然后反转结果来解决它。

【讨论】:

  • 嗨泰德,非常感谢你能解释一下 list = new ArrayList(new HashSet(list));首先我们将列表转换为集合,然后尝试将集合转换回列表。
  • @user1351820 - 转换为 Set 消除重复。转换回List 为您提供了一个具有固定(但未确定)顺序的集合,您可以在其中按索引访问元素。如果您只需要一个集合(没有任何特定顺序 - 可能包括未更改集合的不同迭代的不同顺序),请使用第一个选项。如果您需要保留原始顺序,请使用第三个。
【解决方案2】:

这个:

Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);

【讨论】:

  • @Abshiek,谢谢,所以最终java为我们提供了将列表转换为集合的功能。
  • @user1351820 实际上,Java 提供了一个构造函数来用任何其他 Collection 初始化 Collection,所以它更宽 :)
【解决方案3】:

Java 8方式: list.stream().distinct().collect(Collectors.toList());

完成:)

【讨论】:

  • 尽管您已删除重复项,但您仍然返回 List。这回答了基本问题,但原始发帖人认为他希望得到关于“将列表转换为集合”的答案。
  • 如果需要 Set,你可以在最后做 Collectors.toSet() 而不是 .toList()
【解决方案4】:

如果您需要保留元素顺序,请使用 LinkedHashSet 而不是 HashSet

Set<String> mySet = new LinkedHashSet<String>(list);

【讨论】:

    【解决方案5】:

    只需使用普通的构造函数:

    ArrayList<T> yourList;
    HashSet<T> set = new HashSet<T>(yourList);
    

    您将获得商品的新视图,并删除了重复项,但您将失去订购。到目前为止发布的每个答案都是如此。要继续排序,您应该迭代现有列表并仅在元素重复时才将其删除(这可以使用集合来检查是否已找到元素)。

    【讨论】:

      【解决方案6】:

      您可以首先使用集合或转换成它:

       Set<String> set = new TreeSet<String>(list);
      

      【讨论】:

        【解决方案7】:
        package com.scjp.dump.test;
        
        import java.util.ArrayList;
        
        import java.util.Iterator;
        
        import java.util.List;
        
        public class ArrayListTest {
        
            public static void main(String[] args) {
        
                List<Integer> mylist2 = new ArrayList<Integer>();
        
                List<Integer> mylist1 = new ArrayList<Integer>();
                mylist1.add(3);
                mylist1.add(3);
                mylist1.add(5);
                mylist1.add(9);
                mylist1.add(2);
                mylist1.add(5);
                mylist1.add(5);
                mylist1.add(3);
                mylist1.add(3);
                mylist1.add(3);
                mylist1.add(9);
                mylist1.add(56);
                System.out.println(mylist1);
                Iterator<Integer> itr1 = mylist1.listIterator();
                while (itr1.hasNext()) {
                    Integer itn1 = (Integer) itr1.next();
                    if (mylist2.contains(itn1) == false)
                        mylist2.add(itn1);
                }
        
                System.out.println(mylist2);
        
            }
        
        }
        

        【讨论】:

          【解决方案8】:

          这里有一些方法可以实现这一点。

          使用 Java 8

          List<String> distinctLambda=originalList.stream()
                     .distinct().collect(Collectors.toList());
           System.out.println(distinctLambda);
          

          使用集合

          Set<String> distinctSet=new HashSet<>(originalList);
                  System.out.println(distinctSet);
          

          正常的for循环

          List<String> distinctNewList=new ArrayList<>();
                  for (String temp:originalList) {
                      if(distinctNewList.size()==0){
                          distinctNewList.add(temp);
                          continue;
                      }
          
                      if(!distinctNewList.contains(temp)){
                          distinctNewList.add(temp);
                      }
                  }
          
                  System.out.println(distinctNewList);
          

          这是您的数据集:

          ArrayList<String> originalList = new ArrayList<>();
                  originalList.add("1");
                  originalList.add("2");
                  originalList.add("3");
                  originalList.add("3");
                  originalList.add("5");
                  originalList.add("6");
                  originalList.add("7");
                  originalList.add("7");
                  originalList.add("1");
                  originalList.add("10");
                  originalList.add("2");
                  originalList.add("12");
          

          【讨论】:

            猜你喜欢
            • 2015-01-05
            • 1970-01-01
            • 2018-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多