具有相等项的集合中的 Java 比较器

标签 java set equality comparator treeset

通常在 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/

相关文章:

java - 如何拦截url文件并附加到邮件

java - 如何从命令行运行 Intellij 项目

合并至少共享 2 个元素的集合的算法

java - 运行页面刷新后发生的线程(失控线程)

java - Hibernate -> 获取惰性对象

ruby - 如何检测类似数组或类似集合的值,同时避免类型检查

asp.net - 将集和可选参数传递给存储过程T-SQL-ASP.NET

c# - Resharper - 生成相等成员包括基类成员

c# - 断言动态集合中两个不同的对象是否具有相同的值

python - "=="和 "is"之间有区别吗?