Полный квазипорядок (также называемый полным предварительным порядком) - это разновидность более слабого отношения упорядочения, при котором допускается, что два разных элемента считаются «одного размера». Например, набор всех строк квазиупорядочен по длине, поскольку две разные строки могут иметь одинаковую длину.
Теперь предположим, что у нас есть список строк, и мы хотим отсортировать его по длине (сначала самые короткие). Если две строки имеют одинаковую длину, нам все равно, что будет первым. На первый взгляд кажется разумным написать
Collections.sort(list, (s, t) -> s.length() - t.length());
К сожалению, это незаконно. Javadoc интерфейса Comparator недвусмысленно требует, чтобы сравнение осуществляло полное упорядочение. Это нарушается, потому что "a".length() - "b".length() равно 0, но "a".equals("b") ложно.
Итак, как мы должны сделать это чисто? Под чистым я подразумеваю без введения ложных сравнений, например. по хэш-коду или по естественному порядку.
.equals
, могут быть равны по компаратору. Это не только законно, но и совершенно нормально. Это просто несовместимо с равными. - person Louis Wasserman   schedule 14.10.2015s.length() - t.length()
в результате сравнения. Это правда, что мы в безопасности при работе с положительными значениями (как в этом случае), но для отрицательных результат может перетекать из отрицательного в положительное, что может быть проблемой. Вместо этого лучше использоватьInteger.compare(s.length(), t.length())
. Кстати, вместо(s, t) -> Integer.compare(s.length(), t.length())
мы можем использовать, возможно, немного более четкоеComparator.comparingInt(String::length)
. - person Pshemo   schedule 14.10.2015