Java:TreeSet与多个对象使用compareTo()进行比较相等?

时间:2014-02-04 16:30:04

标签: java collections tree comparison duplicates

我想知道是否有办法绕过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 ++不同)。但是,如果有人有想法,请告诉我。

否则,除了使用TreeMap<K, HashSet<K>>之外,还有一种比从头开始重写TreeSet更简单的方法,或者一种不那么笨拙的方法吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用Guava中的TreeMultiset或其他库中的类似类。

答案 2 :(得分:0)

如果第三方图书馆是公平游戏,我可以使用

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

...就像TreeMap<Integer, Set<MyClass>>,但是significantly nicer to use

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