我一直在寻找类似于 Java TreeSet 在实例化时接收自定义比较器的能力,因此我不需要使用对象的默认相等(和哈希码)标准。
我能想到的最接近的方法是将我的对象包装在一个私有的自定义类中,但这看起来很老套:(这最终成为编程时的一种反复出现的主题,所以我想知道是否有一些东西已经可供我们使用。也许在公共图书馆?
Thanks
不,您已经找到了您应该使用的解决方案。
即使是TreeSet
, it's 皱起眉头 http://docs.oracle.com/javase/6/docs/api/java/util/SortedSet.html使用不兼容的比较标准equals
:
请注意,如果排序集要正确实现 Set 接口,则排序集维护的顺序(无论是否提供显式比较器)必须与 equals 一致。
我不知道 Apache Commons,但 Guava具体来说 https://code.google.com/p/guava-libraries/issues/detail?id=188#c9 rejected https://code.google.com/p/guava-libraries/issues/detail?id=576#c17对此类事情的请求,尽管您可以使用来实现您想要的番石榴等效物 https://guava.dev/releases/28.0-jre/api/docs/com/google/common/base/Equivalence.html:
Equivalence<T> equivalence = new Equivalence<T>() {
@Override
protected boolean doEquivalent(T a, T b) {
return CustomComparator.equals(a, b);
}
@Override
protected int doHash(T item) {
return CustomHashCodeGenerator.hashCode(item);
}
};
List<T> items = getItems();
Set<Equivalence.Wrapper<T>> setWithWrappedObjects = items.stream()
.map(item -> equivalence.wrap(item))
.collect(Collectors.toSet());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)