Как отмечено выше, для строк не определена операция вычитания, поэтому данный компаратор следует переписать следующим образом (с учетом обратного порядка сортировки):
public class ComparatorCity implements Comparator<City> {
@Override
public int compare(City o1, City o2) {
return o2.getName().compareTo(o1.getName());
// return o2.getName().compareToIgnoreCase(o1.getName()); // без учета регистра
}
}
Однако создание отдельного класса для компаратора -- уже достаточно устаревший синтаксис.
Для сортировки городов в алфавитном порядке по убыванию названий достаточно воспользоваться статическими методами интерфейса Comparator
, создавая сразу экземпляр компаратора с нужной логикой:
Comparator<City> byNameDesc = Comparator.comparing(City::getName, Comparator.reverseOrder());
Comparator<City> byNameDesc2 = Comparator.comparing(City::getName).reversed();
Для сравнения строк без учета регистра можно воспользоваться String.CASE_INSENSITIVE_ORDER
:
Comparator<City> byNameAnyCaseDesc = Comparator.comparing(
City::getName, String.CASE_INSENSITIVE_ORDER
)
.reversed();
Касаемо использования операции вычитания при сравнении, это в принципе антипаттерн, так как даже при сравнении целых чисел такой способ не гарантирует корректного порядка из-за возможных ошибок переполнения.