【问题标题】:TreeSet Comperator树集比较器
【发布时间】:2009-09-04 13:39:51
【问题描述】:

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

我没有看到 javadocs 中记录了这种行为。也许我错过了什么。你能确认这种行为吗?

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

如果我想拥有多个具有相同排名的对象,就必须这样吗?

【问题讨论】:

  • 请添加您的研究、逻辑、当前结果和预期结果,以便社区了解确切的问题并尝试解决您的问题。

标签: java collections


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,这记录在JavaDoc for TreeSet

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

    【讨论】:

      【解决方案3】:

      如果您想要一个可以容纳多个彼此相等的对象的排序集合,那么来自 Google Collections 的 TreeMultiset 可能会成功。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多