【问题标题】:Java: TreeSet with multiple objects that compare as equal using compareTo()?Java:具有多个使用 compareTo() 比较相等的对象的 TreeSet?
【发布时间】:2014-02-05 01:29:22
【问题描述】:

我想知道是否有办法绕过对象 w.r.t 的唯一性。 compareTo() / Comparator.compare() 方法。例如,假设我有课

class MyClass extends Comparable<MyClass> {
  int value;
  // ... plenty of other fields
  public int compareTo(MyClass other) { ... // compares using the value field }
}

并希望将 MyClass 的不同实例放入 TreeSet。不同的是,我的意思是如果默认的equals() 会为两个插入的对象返回false,那么两者都应该保留在 TreeSet 中。

当然,以“高”正确率实现这一点的方法是让 compareTo() 方法首先检查 value 字段,如果出现平局,则通过比较hashCode() 值。

我怀疑是否存在实现所需行为的方法,因为 Java 不提供将引用转换为可比较类型的安全方法(与 C/C++ 不同)。但是,如果有人有任何想法,请告诉我。

否则,有没有比从头重写 TreeSet 更简单的替代方法,或者比使用 TreeMap&lt;K, HashSet&lt;K&gt;&gt; 更简单的替代方法?

【问题讨论】:

  • 完整显示 compareTo 和 equals 可能会有所帮助

标签: java collections tree comparison duplicates


【解决方案1】:

为每个实例添加一个内部 uniqueId。您可以使用 AtomicLong 或 UUID 来生成所说的 uniqueId。

【讨论】:

    【解决方案2】:

    使用来自 Guava 的 TreeMultiset,或来自另一个库的类似类。

    【讨论】:

      【解决方案3】:

      如果第三方库是公平的游戏,我可能会使用Guava 来实现这一点

      SetMultimap<Integer, MyClass> multimap = 
          MultimapBuilder.treeKeys().hashSetValues().build();
      

      ...类似于TreeMap&lt;Integer, Set&lt;MyClass&gt;&gt;,但significantly nicer to use

      值得注意的是,当您实际使用不同的平等概念时,使用MyClass 作为“树”键并不是一个好的设计理念。取而代之的是,从代码中的外观中提取您实际比较的密钥 - Integer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多