给定List
个MyClass
个对象(如果需要,还有自定义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有一个很好的参考吗?
答案 0 :(得分:3)
如果元素的equals(Object)
方法没有为您提供所需的语义,则HashMap
或HashSet
不是选项。您的选择是:
TreeMap
进行重复数据删除。这是O(NlogN)
。ArrayList
或副本进行排序,然后迭代查找元素i等于元素i + 1.这是O(NlogN)
。 equals(Object)
和hashCode()
,并使用HashSet
包装对象进行重复数据删除。这是O(N)
,但由于创建了包装器对象,因此比例常数将大于简单HashSet
。使用Set
进行重复数据删除时,最好使用循环而不是addAll
。如果您需要知道所有重复项是什么,这是必要的。如果您不需要知道,那么使用循环可以让您在找到第一个副本时停止。 addAll
可能表现更好的唯一情况是可能没有重复项。
答案 1 :(得分:0)
如果您已经有一个已排序的列表,您可以查看任何元素和下一个元素,如果它们是相同的,则您有重复。
在您的问题中,您正在使用TreeSet,它已经剔除了重复项,因此如果您只需要知道是否重复项,只需检查mySet的大小与myList的大小。如果他们不一样,你就有重复。