bad operand types for binary operator

Рейтинг: 3Ответов: 1Опубликовано: 21.01.2023

работаю с Comparator, компилятор выдает ошибку: bad operand types for binary operator '-' . Поле Name - String. Подскажите пожалуйста в чем дело?

import java.util.Comparator;

public class ComparatorCity implements Comparator<City> {

    @Override
    public int compare(City o1, City o2) {
     return o1.getName()-o2.getName();

    }
}

Ответы

▲ 1

Как отмечено выше, для строк не определена операция вычитания, поэтому данный компаратор следует переписать следующим образом (с учетом обратного порядка сортировки):

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();

Касаемо использования операции вычитания при сравнении, это в принципе антипаттерн, так как даже при сравнении целых чисел такой способ не гарантирует корректного порядка из-за возможных ошибок переполнения.