我有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不知道如何比较每个列表以禁止重复。我需要覆盖比较方法吗?如果是这样,我该怎么做?这是解决这个问题的正确方法吗?
谢谢!
答案 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());