全准序(也称为全预序)是一种较弱的排序关系,允许两个不同的元素被认为是“相同大小”。例如,所有字符串的集合是按长度准排序的,因为两个不同的字符串可以具有相同的长度。
现在假设我们有一个字符串列表,我们想按长度排序(最短的优先)。如果两个字符串的长度相同,我们不关心哪个先出现。乍一看,这样写似乎有道理
Collections.sort(list, (s, t) -> s.length() - t.length());
不幸的是,这是非法的。Comparator 接口的 Javadoc 明确要求比较必须实现总排序。这是违反的,因为 "a".length() - "b".length() 等于 0,但 "a".equals("b") 是假的。
那么,我们应该如何干净地做到这一点呢?干净地说,我的意思是不引入虚假比较,例如通过哈希码或自然排序。