【问题标题】:How to find unique elements in multiple ArrayList in Java如何在 Java 中的多个 ArrayList 中查找唯一元素
【发布时间】:2012-12-08 13:16:16
【问题描述】:

我有多个Integer ArrayList,其中包含一些重复的元素。我想从他们那里得到独特的元素。但是如何呢?
java.util.ArrayList.removeAll() 并不能完全满足我的目的。请参阅下面的测试代码-

ArrayList<Integer> d = new ArrayList<Integer>();
d.add(2);
d.add(4);
d.add(5);
d.add(7);
d.add(8);
d.add(9);

ArrayList<Integer> e = new ArrayList<Integer>();
e.add(3);
e.add(7);

d.removeAll(e);

for (int t : d) {
    System.out.print(t+", ");
}

在输出中,我得到 2, 4, 5, 8, 9, 。显然3 不见了。同样为了简单起见,我在这里只使用了两个ArrayList,但在我的代码中,我有两个以上的ArrayList

如何在 Java 中的多个 ArrayList 中找到唯一元素

【问题讨论】:

  • 根据您的代码,您得到的输出是显而易见的。我的理解是7 很常见,应该只删除 7 个并添加 3 个......对吗?然后使用Set。它不会添加重复项...这样您将拥有所有唯一列表...

标签: java set unique


【解决方案1】:

从您的List&lt;Integer&gt; 创建一个Set&lt;Integer&gt;。该集合将不包含重复的对象:

List<Integer> lstNumbers = new ArrayList<Integer>();
//fill the list of integers...
Set<Integer> setNumbers = new HashSet<Integer>(lstNumbers);
//the set will contain no duplicate values...
for (int t : setNumbers) {
    System.out.print(t+", ");
}

请注意,您可以在 Set 中添加更多 List&lt;Integer&gt;,方法是使用 Set#addAll 方法(如 rahulroc 答案中所示)在不重复的元素集合中添加更多整数:

//assuming setNumbers has been initialized before
setNumbers.addAll(anotherListOfNumbers);
setNumbers.addAll(andAnotherListOfNumbers);

此外,作为最佳实践,尝试对接口(List、Set 等)进行编程,而不是对类实现(ArrayList、HashSet),如下所示:What does it mean to “program to an interface”?

【讨论】:

  • 首先,我需要添加所有ArrayList,然后我必须创建HashSet。我说的对吗?
  • @RaviJoshi 是的,首先用重复的元素填充ArrayList,然后创建Set
  • @LuiggiMendoza .. 太好了,您根据我的评论更新了您的答案。我猜你从问题中错过了这一点
  • @Muklas 是的,这可以与Strings 一起正常工作,主要是因为HashSet 使用hashCodeequals 方法,而String 实现了它。您也可以使用自己的类来检查唯一结果,只要您使用 HashSet 并且您的类也实现了这些方法。
【解决方案2】:

使用java.util.HashSet

Set<Integer> uniqueEntries = new HashSet<Integer>();
for(all lists)
     uniqueEntries.addAll(list);

现在设置的 uniqueEntries 将包含所有唯一的整数值。

【讨论】:

  • 您可以在HashSet 构造函数中使用Collection&lt;E&gt; 作为参数。
  • 是的,我们可以。但他不只有一个数组列表。他需要添加多个数组列表。因此,构造函数无法实现全部目的,因为他必须遍历所有数组列表的整个列表。
【解决方案3】:

使用Set

ArrayList<Integer> d = new ArrayList<Integer>();
d.add(2);
d.add(4);
d.add(5);
d.add(7);
d.add(8);
d.add(9);

d.add(3);
d.add(7);

// this will remove all duplicates
Set setNew = new HashSet(d);

System.out.print(setNew);

Demo

【讨论】:

  • 我最喜欢DEMO。你这个摇滚伙伴。谢谢你。我现在明白了。
【解决方案4】:
 ArrayList<Integer> d = new ArrayList<Integer>();
        d.add(2);
        d.add(4);
        d.add(5);
        d.add(7);
        d.add(8);
        d.add(9);

        ArrayList<Integer> e = new ArrayList<Integer>();
        e.add(3);
        e.add(7);

        List<Integer> temp = new ArrayList<Integer>(d);

        System.out.println("d --> " + d);
        System.out.println("e --> " + e);

        d.removeAll(e);
        e.removeAll(temp);
        d.addAll(e);

        System.out.println("d --> " + d);

【讨论】:

    【解决方案5】:
    /* ArrayList Unique & Duplicate Records Print */
    
    import java.util.*;
    import java.lang.*;
    import java.io.*;
    
    /* Name of the class has to be "Main" only if the class is public. */
    class Ideone
    {
        public static void main (String[] args) throws java.lang.Exception
        {
    ArrayList<Integer> d = new ArrayList<Integer>();
            d.add(2);
            d.add(4);
            d.add(5);
            d.add(7);
            d.add(8);
            d.add(9);
    
            ArrayList<Integer> e = new ArrayList<Integer>();
            e.add(3);
            e.add(7);
    
            List<Integer> temp = new ArrayList<Integer>(e);
    
            System.out.println("d --> " + d);
            System.out.println("e --> " + e);
    
            e.removeAll(d);
            temp.removeAll(e);
    
            System.out.println("e (unique)--> " + e);
            System.out.println("temp (duplicate) --> " + temp);
        }
    }
    

    【讨论】:

      【解决方案6】:

      您可以更简单地做到这一点。

      ArrayList first = new Arraylist; ArrayList 第二 =新数组列表;

         first.add("one"); 
         first.add("two");  
         first.add("three"); 
         second.add("two");  
         second.add("three");
      

      为了找到独特的元素.. first.retainall(second);

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 1970-01-01
        • 2013-05-07
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 2022-06-29
        • 2021-05-15
        相关资源
        最近更新 更多