通常在 TreeSet 中不应该有两个相等的项目。但实际上,在某些情况下,您经常想要维护排序列表而不是集合。 Java 中仍然没有 TreeList 或任何 SortedList。当然,您可以使用 Collections.sort()。
我的问题是:使用 TreeSet(或任何排序集)以便它也能够包含相同项目的正确方法是什么?
我通常会做这样的事情:
new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
int result = Float.compare(o1.getDistance(), o2.getDistance());
//both distances are equal so we use the object hash as distinctive
//property.
if (result == 0) {
result = Integer.compare(System.identityHashCode(o1),
System.identityHashCode(o2))
}
return result;
}
}
虽然这工作得很好,但这当然有一个缺点,即哈希冲突的可能性仍然很小,这会导致 TreeSet 中丢失对象 .
所以我想知道是否有更好的方法来真正正确地区分这些对象?
最佳答案
我一直在使用
import com.google.common.collect.TreeMultiset;
毫不费力且成功。
当有好的库存在时,您不应该尝试使用解决方法。
当然,可能还有其他库。
稍后
我应该在“equal”和“set”的组合上提出危险信号。这是一个禁忌。您可以在 Map 中拥有多个相等的键。
如果要重复存储对象,即使它们相等,也使用List;由您决定是否添加相等的元素。
另一个想法:
也许您想要一个使用引用相等而不是 equals 的 IdentityHashMap。
但是,如果您违反了类中的 hashCode/equals 约定,请做好迎接无尽困难的准备。
关于具有相等项的集合中的 Java 比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24893646/