【问题标题】:TreeSet and equals functionTreeSet 和 equals 函数
【发布时间】:2010-09-07 03:15:13
【问题描述】:

有一个 Java bean 对象根据特定标准(标准 A)实现了equals 函数。我需要根据另一个标准(标准 B)识别唯一对象。由于equals 函数使用标准A,我不能使用HashSet。所以我想将TreeSet 与基于标准B 的自定义Comparator 一起使用。我的问题是,是否允许这样做?这种方法有什么问题吗?

谢谢。

【问题讨论】:

    标签: java equals comparator treeset


    【解决方案1】:

    以下是 Oracle Java 的一些指南:

    请注意,由 a 维护的排序 设置(无论是否显式 比较器提供)必须是 与equals一致 正确实现 Set 接口。 (请参阅 Comparable 或 Comparator for a 符合的精确定义 等于。)之所以如此,是因为 Set 接口是根据定义的 等于操作,但是一个 TreeSet 实例执行所有键比较 使用它的 compareTo(或比较) 方法,所以两个键被视为 用这种方法相等的是,从 集合的立场,平等。这 集合的行为甚至是明确定义的 如果它的顺序与 等于;它只是不服从 Set 接口的通用合约。

    我认为在技术方面,不,你没有任何问题。但是,在编码、可读性和可维护性方面,你必须小心,因为其他人可能会误用或误解你在做什么

    【讨论】:

      【解决方案2】:

      如果您经常执行搜索并且很少添加元素,请考虑将它们保存在按标准 B 排序的 List 中并使用 Collections.binarySearch

      【讨论】:

        【解决方案3】:

        你可以把它们包装起来:

        class BeanWrapper {
        
         ...
        
         public boolean equals(Object other) {
          return myBean.critB.equals(((Bean)other).critB);
         }
        
        }
        

        然后把它们放在这样的集合中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-29
          • 2021-01-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多