使用集合删除重复列表

时间:2017-02-19 17:30:58

标签: java arraylist collections

我有3个列表,其中两个是重复的。我想将这些列表存储到一个单元中,删除所有重复项,因此我想将每个列表添加到集合中。这就是我试过的:

List<Integer> coins1 = Arrays.asList(5, 5, 10);
List<Integer> coins2 = Arrays.asList(5, 10, 5);
List<Integer> coins3 = Arrays.asList(10, 10);

coins1.sort((a, b) -> a.compareTo(b));
coins2.sort((a, b) -> a.compareTo(b));
coins3.sort((a, b) -> a.compareTo(b));

Collection<List<Integer>> allCoinPossibilities = new TreeSet();

allCoinPossibilities.add(coins1);
allCoinPossibilities.add(coins2);
allCoinPossibilities.add(coins3);

我收到错误&#34; java.util.Arrays $ ArrayList无法强制转换为java.lang.Comparable&#34;。错误是有道理的,Collection不知道如何比较每个列表以禁止重复。我需要覆盖比较方法吗?如果是这样,我该怎么做?这是解决这个问题的正确方法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

为什么不改用HashSet

List已经有一个很好的hashCode实施方案和一个正确的equals方法。

另外,比较List s在逻辑上是不可能的 - 考虑比较两组数字。如何将[2, 3, 8][1, 7, -2]进行比较?

Set<List<Integer>> noDuplicates = new HashSet<>();

noDuplicates.add(coins1);
noDuplicates.add(coins2);
noDuplicates.add(coins3);

//Now there are no duplicate lists.

请记住,列表也必须具有相同的排序,否则equals将返回false。如果您不需要此要求,也可以使用Set作为硬币。

答案 1 :(得分:2)

制作一个HashSet并将所有内容添加到其中。

最后,你只剩下独特的元素

List<Integer> coins1 = Arrays.asList(5, 5, 10);
List<Integer> coins2 = Arrays.asList(5, 10, 5);
List<Integer> coins3 = Arrays.asList(10, 10);

Set<Integer> dedupedCollection = new HashSet<Integer>();

dedupedCollection.add(coins1);
dedupedCollection.add(coins2);
dedupedCollection.add(coins3);

return dedupedCollection;

然后您可以return dedupedCollection;作为最终设置,没有重复的内容。

答案 2 :(得分:0)

您可以编写自己的comparator并在创建TreeSet时将其作为参数传递,例如:

class ListComparator implements Comparator<List<Integer>>{

    @Override
    public int compare(List<Integer> o1, List<Integer> o2) {
        // TODO comparison logic
        return 0;
    }

}

Collection<List<Integer>> allCoinPossibilities = new TreeSet(new ListComparator());