【发布时间】:2013-03-05 12:59:46
【问题描述】:
在 Java 中,Comparator 接口允许客户端为任何类型指定 equals() 和 compare() 方法。 Comparator 可以传递给大多数(或所有)需要排序的集合,并且将使用 Comparator 中的方法而不是指定类的方法。这允许客户端以不同于其自然顺序的方式对对象进行排序,甚至可以对没有自然顺序的对象进行排序(即不实现 Comparable)。
为什么没有类似的哈希接口?它可以指定两种方法,hashCode() 和 equals(),并且对 HashSet 或 HashMap 有用,就像比较器对排序有用一样。
编辑:对于那些将这个问题标记为this other question 的重复项的人,我会提到另一个问题是为什么 hashCode 包含在每个类中而不是接口中,而这个问题是关于抽象散列函数以允许多个它的实现。
回答编辑:获得此功能的最佳方法似乎是:
-如果您可以使用外部库和/或已经在使用 Guava(由于很多原因,这是一个很棒的库),Guava 有一个 Equivalence 类允许这样做。
-如果您不想使用外部库,可以使用自定义构建的适配器,类似于this SO question 上的顶级答案中所做的。
【问题讨论】:
-
首先,
hashCode是来自Object的本机实现。这意味着它将始终在任何类中定义。equals也在 Object 中定义。这两者总是在任何情况下都被定义,因此为它们提供接口是没有意义的。 -
@Legend。当然,这可能是有道理的。在特定情况下,如果姓名相同,您可能希望将人视为平等,而在另一种情况下,如果他们具有相同的 SSN,您可能希望将他们视为平等。就像使用比较器一样,您可以将其外部化为“均衡器”。适配器模式可能是解决这个问题的最佳解决方案(诚然,比希望以不同方式对对象进行排序的频率要低得多)
-
见 Guava 的Equivalence
-
你说这没有意义。那是完全错误的。这说得通。番石榴创造了这样的东西。例如,它也有 Multimap。你是说 Multimap 没有意义,只是因为 Sun 没有在 JDK 中添加它?仅仅因为它对你没有用并不意味着它没有意义。
标签: java collections hash comparator