java - 我可以将 Collections.sort 与准顺序一起使用吗?

标签 java sorting comparator preorder

全拟序(也称为全预序)是一种较弱的有序关系,它允许两个不同的元素被认为是“相同大小”。例如,所有字符串的集合按长度准排序,因为两个不同的字符串可以具有相同的长度。

现在假设我们有一个字符串列表,并且我们想按长度对其进行排序(最短的在前)。如果两个字符串具有相同的长度,我们不关心哪个先出现。 乍一看,这样写似乎很有道理

Collections.sort(list, (s, t) -> s.length() - t.length());

不幸的是,这是非法的。 Comparator 接口(interface)的 Javadoc 明确要求比较必须实现全排序。这是违反的,因为 "a".length() - "b".length() 等于 0,但 "a".equals("b") 为 false。

那么,我们应该如何干净利落地做到这一点呢?我所说的干净是指不引入虚假比较,例如通过哈希码或自然排序。

最佳答案

您误解了文档。当他们说

A comparison function, which imposes a total ordering on some collection of objects.

这是一个定义,而不是要求。对于给定的 Comparatorc,如果 c.compare(o1, o2) == 0,则出于co1o2 定义的顺序相等。

文档继续讨论了 Comparator 与 equals 一致的含义,这基本上意味着 Comparator 中固有的平等感如上所述,与允许对象的 equals() 方法中固有的相同。该讨论基于某些Comparator可能不具有该特征的可能性,而您提议的比较器则不具有该特征。使用此类 Comparator 来排序 SortedSetSortedMap 可能会产生违反这些接口(interface)约定的行为,但使用此类并没有什么问题带有 Collections.sort()Comparator

关于java - 我可以将 Collections.sort 与准顺序一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33112994/

相关文章:

java - 如何处理高分辨率图像?

java - HashMap 的自定义哈希码/等于操作

java - 如何列出所有已部署的 jax-ws web 服务?

java - 为什么以下测试用例的代码输出为 3?

xml - 如何根据子元素中的新计数值对元素进行排序。 XSLT 1.0

java - HTTP 状态 500 - servlet spring-dispatcher 的 Servlet.init() 抛出异常

Java 8 流逆序

java - 在 Java 中对 Pair<String,Integer> 进行排序

C++ 如何使用用户定义的比较器将 priority_queue 作为属性正确添加到类中?

java - 比较方法违反了它的一般契约!静态分析可以吗?