我想知道是否有办法绕过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更简单的方法,或者一种不那么笨拙的方法吗?
答案 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
。