全拟序(也称为全预序)是一种较弱的有序关系,它允许两个不同的元素被认为是“相同大小”。例如,所有字符串的集合按长度准排序,因为两个不同的字符串可以具有相同的长度。
现在假设我们有一个字符串列表,并且我们想按长度对其进行排序(最短的在前)。如果两个字符串具有相同的长度,我们不关心哪个先出现。 乍一看,这样写似乎很有道理
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.
这是一个定义,而不是要求。对于给定的 Comparator
,c
,如果 c.compare(o1, o2) == 0
,则出于c
、o1
和 o2
定义的顺序相等。
文档继续讨论了 Comparator
与 equals 一致的含义,这基本上意味着 Comparator
中固有的平等感如上所述,与允许对象的 equals()
方法中固有的相同。该讨论基于某些Comparator
可能不具有该特征的可能性,而您提议的比较器则不具有该特征。使用此类 Comparator
来排序 SortedSet
或 SortedMap
可能会产生违反这些接口(interface)约定的行为,但使用此类并没有什么问题带有 Collections.sort()
的 Comparator
。
关于java - 我可以将 Collections.sort 与准顺序一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33112994/