Java:测试集合中的重复对象

时间:2010-08-25 23:40:53

标签: java collections testing equality

给定ListMyClass个对象(如果需要,还有自定义Comparitor myComparitor),有哪些好的选项可用于检查List是否包含两个“相等”对象?

编辑:如果有重复项,请返回对一个或多个重复项的引用。

在这种情况下覆盖MyClass.equals(MyClass)不是一种选择。

我最初的想法是创建一个各种哈希表,但我怀疑有一种非黑客的方式来完成同样的事情:

SortedSet mySet = new TreeSet(myComparitor);
mySet.addAll(myList);
// Find duplicates in a sorted set in O(N) time

P.S。 Markdown有一个很好的参考吗?

2 个答案:

答案 0 :(得分:3)

如果元素的equals(Object)方法没有为您提供所需的语义,则HashMapHashSet不是选项。您的选择是:

  • 使用TreeMap进行重复数据删除。这是O(NlogN)
  • ArrayList或副本进行排序,然后迭代查找元素i等于元素i + 1.这是O(NlogN)
  • 查找散列集的替代实现,它允许您提供单独的对象来实现相等性和散列。 (Apache或Google系列都不支持此功能,因此您需要进一步了解。)
  • 为您的元素类型创建一个包装类,该类包含equals(Object)hashCode(),并使用HashSet包装对象进行重复数据删除。这是O(N),但由于创建了包装器对象,因此比例常数将大于简单HashSet

使用Set进行重复数据删除时,最好使用循环而不是addAll。如果您需要知道所有重复项是什么,这是必要的。如果您不需要知道,那么使用循环可以让您在找到第一个副本时停止。 addAll可能表现更好的唯一情况是可能没有重复项。

答案 1 :(得分:0)

如果您已经有一个已排序的列表,您可以查看任何元素和下一个元素,如果它们是相同的,则您有重复。

在您的问题中,您正在使用TreeSet,它已经剔除了重复项,因此如果您只需要知道是否重复项,只需检查mySet的大小与myList的大小。如果他们不一样,你就有重复。