【发布时间】:2014-07-22 17:12:16
【问题描述】:
通常在 TreeSet 中不应该有两个相等的项。但实际上,在某些情况下,您经常想要维护一种排序的 List 而不是 Set。 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 中丢失对象 .
所以我想知道是否有更好的方法来真正正确区分这些对象?
【问题讨论】:
-
哦,不要那样使用 TreeSet,除非你的目的是混淆其他人。
-
您可以向 MyObject 添加一个字段,该字段对于不同的记录应该始终是唯一的。或者您可以使用 List 并对其进行排序。
-
有时两个对象之间的唯一区别是,它们是两个不同的对象。所以当然,如果我可以添加一个唯一的 ID,我肯定会使用它。但有时这是不可能的。
标签: java set equality comparator treeset