Java:用于确定等价性的外部类?
Java有一个用于提供类本身外部对象的比较的方法,以允许多个/备用方法进行有序比较 但是进行无序比较的唯一标准方法是在类中重写Java:用于确定等价性的外部类?,java,guava,equivalence-classes,Java,Guava,Equivalence Classes,Java有一个用于提供类本身外部对象的比较的方法,以允许多个/备用方法进行有序比较 但是进行无序比较的唯一标准方法是在类中重写equals() 当我想在一个类外部提供多个/备用无序比较时,我应该怎么做?(明显的用例是根据特定属性将集合划分为等价类。) 假设最终用于无序检查(例如,不用于排序或索引),是否可以实现仅检查相等的比较器,如果两个对象相等,则返回0,并返回一个值!=当两个对象不相等时为0?(注意:我不跳上这个解决方案的唯一原因是,从技术上讲,它可以通过不提供满足传递性和对称性的关系来打破
equals()
当我想在一个类外部提供多个/备用无序比较时,我应该怎么做?(明显的用例是根据特定属性将集合划分为等价类。)
假设最终用于无序检查(例如,不用于排序或索引),是否可以实现仅检查相等的比较器
,如果两个对象相等,则返回0,并返回一个值!=当两个对象不相等时为0?(注意:我不跳上这个解决方案的唯一原因是,从技术上讲,它可以通过不提供满足传递性和对称性的关系来打破比较器的契约。)
似乎应该有一个EqualsComparator
标准类或其他东西
(Guava可以处理类似的事情吗?是的,Guava有接口和类(在Guava 14.0版中删除)
(是的,这在Java中非常有用,但遗憾的是它缺乏。我们确实应该为HashMap
,HashSet
等提供相关选项。)
虽然在某些情况下,Comparator
可能没问题,但它没有提供对基于哈希的集合很重要的hashCode
方法。hmmm。。。两者都被标记为@Beta。@Jason:所以请小心使用:)(最终,等价性
是一个接口,所以你不会依赖一个可能消失的实现。)我可以保证它不会消失,但它在不断变化。例如,对于即将发布的10.0版,我们将其更改为一个抽象类,并将大部分等价物直接移入其中(并且可能在某个时候完成这项工作)。但是,对于基于任意等价的集合,我显然不相信。Java有太多年的固定假设(以及明确的收集
契约),要求等于
。相反,您可以使用yourEquivalence.wrap(yourObject)
并将包装器存储在集合中;笨重,但清晰。@Kevin是的,很遗憾你们这么想:-)