TreeSet Comperator

3 java collections

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

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

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

如果我想要多个具有相同排名的对象,那就是它必须的样子吗?

mru*_*ueg 7

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

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


Sim*_*son 6

是的,这在JavaDoc for TreeSet中有记录:

请注意,由集合维护的排序(无论是否提供显式比较器)必须与equals是否正确实现Set接口一致.(请参阅ComparableComparator了解与之一致的精确定义 equals.)这是因为Set 接口是根据equals操作定义的 ,但是TreeSet 实例使用其compareTo(或 compare)方法执行所有元素比较,因此通过此方法认为两个元素相等从集合的角度来看,是平等的.集合的行为即使其排序不一致也是明确定义的equals; 它只是不遵守Set界面的一般合同.(强调我的)