我使用了一个带有自编写比较器的TreeSet。现在,当我向TreeSet添加元素并且Comparator的compare方法返回0时,看起来TreeSet只包含一个具有相同排名的Object。
我没有看到javadocs中记录了这种行为。也许我想念一些东西。你能证实这种行为吗?
我编辑了比较器。现在它永远不会返回0并且TreeSet包含所有具有相同排名的对象。
如果我想让多个对象具有相同的排名,那么它是否必须如此?
答案 0 :(得分:7)
这就是必须的方式,因为一个集合被定义为只包含一次相等的对象。
当比较器返回0时,两个对象被认为是相等的,因此集合中只包含所有相等对象中的一个(可能是第一个)。
答案 1 :(得分:6)
是的,这在JavaDoc for TreeSet:
中有记录注意由a维护的排序 设置(无论是否明确 提供比较器)必须 与
equals
一致,如果是的话 正确实现Set
接口。 (有关,请参阅Comparable
或Comparator
精确定义符合equals
。)这是因为Set
接口是根据的定义的equals
操作,但是TreeSet
instance执行所有元素 比较使用compareTo
(或compare
)方法,所以有两个元素 被这种方法认为是平等的, 从集合的角度来看,是平等的。 集合的行为是明确定义的 即使它的排序不一致 与equals
;它只是没有服从Set
接口的一般合同。 (强调我的)
答案 2 :(得分:1)
如果你想要一个可以容纳多个彼此相等的对象的排序集合,那么Google Collections的TreeMultiset可能就可以了。