TreeSet比较器

时间:2009-09-04 13:39:52

标签: java collections

我使用了一个带有自编写比较器的TreeSet。现在,当我向TreeSet添加元素并且Comparator的compare方法返回0时,看起来TreeSet只包含一个具有相同排名的Object。

我没有看到javadocs中记录了这种行为。也许我想念一些东西。你能证实这种行为吗?

我编辑了比较器。现在它永远不会返回0并且TreeSet包含所有具有相同排名的对象。

如果我想让多个对象具有相同的排名,那么它是否必须如此?

3 个答案:

答案 0 :(得分:7)

这就是必须的方式,因为一个集合被定义为只包含一次相等的对象。

当比较器返回0时,两个对象被认为是相等的,因此集合中只包含所有相等对象中的一个(可能是第一个)。

答案 1 :(得分:6)

是的,这在JavaDoc for TreeSet

中有记录
  

注意由a维护的排序   设置(无论是否明确   提供比较器)必须   与equals一致,如果是的话   正确实现Set接口。   (有关,请参阅ComparableComparator   精确定义符合   equals。)这是因为Set   接口是根据的定义的   equals操作,但是TreeSet   instance执行所有元素   比较使用compareTo(或   compare)方法,所以有两个元素   被这种方法认为是平等的,   从集合的角度来看,是平等的。   集合的行为是明确定义的   即使它的排序不一致   与equals;它只是没有服从   Set接口的一般合同。 (强调我的)

答案 2 :(得分:1)

如果你想要一个可以容纳多个彼此相等的对象的排序集合,那么Google Collections的TreeMultiset可能就可以了。