Как написать Comparator.comparing

У меня есть следующая программа

 List<String> numbers = Arrays.asList("10", "68", "97", "9", "21", "12");

Collections.sort(numbers, (a, b) -> (b + a).compareTo(a + b));

Привет

Как мне переписать этот код

(b + a).compareTo(a + b)

до Comparator.comparing

Заранее спасибо.

В чем смысл этого компаратора? b+a всегда будет равно a+b, поэтому compareTo всегда будет возвращать 0, и это не повлияет на порядок в списке.

Mureinik 20.02.2019 07:42

За исключением того, что мы сравниваем String, а не int

Wisthler 20.02.2019 07:46

Также укажите ожидаемый результат, чтобы выяснить, что не так.

Mohamed Anees A 20.02.2019 07:48
(b+a) всегда будет равно (a+b) во всех измерениях.
Vishwa Ratna 20.02.2019 07:51

Этот компаратор нарушает требование транзитивности, так как считает пустую строку равной любой другой строке, в то время как не каждая строка равна любой другой.

Holger 21.02.2019 14:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
151
3

Ответы 3

Вы сравниваете строки друг с другом, чтобы отсортировать список.

Если вы сортируете с помощью a+b, это означает, что результат сравнения всегда будет давать вам один и тот же результат.

используйте следующий код

numbers.sort((a, b) -> a.compareTo(b));

Сложение строк — это не то же самое, что сложение целых чисел, поэтому a + b != b + a.

Klitos Kyriacou 20.02.2019 08:17

Вот некоторые из образцов Comparator.comparing полезен, когда у вас есть сложный объект, и вы хотите упорядочить на основе его свойств. Далее я отсортировал строку по ее длине.

List<String> numbers = Arrays.asList("10", "68", "97", "9", "21", "12");

Collections.sort(numbers, Comparator.naturalOrder()); //[10, 12, 21, 68, 9, 97]

Collections.sort(numbers, Comparator.reverseOrder()); //[97, 9, 68, 21, 12, 10]

numbers.sort(Comparator.comparing(String::length)); //[9, 97, 68, 21, 12, 10]

numbers.sort(Comparator.comparing(String::intern)); //[10, 12, 21, 68, 9, 97]

numbers.sort(Comparator.comparing((String num) -> num, (a, b) -> (b+a).compareTo(a+b)));// [9, 97, 68, 21, 12, 10]

    List<Movie> movies = Arrays.asList(
    new Movie("Lord of the rings"),
    new Movie("Back to the future"),
    new Movie("Carlito's way"),
    new Movie("Pulp fiction"));

    movies.sort(Comparator.comparing(Movie::getTitle));

Ссылка: https://reversecoding.net/java-8-comparator-how-to-sort-a-list/

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-

Структура Компаратор.сравнение() предназначена для использования в объектах с несколькими полями, поэтому вы можете извлечь нужное поле для использования в качестве ключа. Этот метод принимает в качестве параметра Функция, используемый для извлечения Сопоставимый ключ сортировки.

Однако для сортировки List<String> это не требуется.
Поскольку есть только ваше строковое значение и никаких других неоднозначных полей, которые можно использовать в качестве ключа.

Если вы хотите отсортировать этот список по (а+б).сравнить с(б+а)

List<String> numbers = Arrays.asList("10", "68", "97", "9", "21", "12");

Затем ваш код со стандартным компаратором:

numbers.sort((a, b) -> (a+b).compareTo(b+a));

и код с использованием Compartor.comparing:

numbers.sort(Comparator.comparing((String s) -> s, (a, b) -> (a+b).compareTo(b+a)));

оба выведут:

[ 10, 12, 21, 68, 97, 9 ]

Но, как видите, в List<String> это не нужно и приводит к дублированию кода.


if it is unclear, then here is an example of a proper use case of Comparator.comparing
Let's say we have this class
public class Car {
    private String name;
    private String type;
    private int tires;

    public Car(String name, String type, int tires) {
        this.name = name;
        this.type = type;
        this.tires= tires;
    }

    public String getName() {
        return name;
    }
    public String getType() {
        return type;
    }
    public int getTires() {
        return tires;
    }
}

И список автомобилей

List<Car> carsList = new ArrayList<Car>();
carsList.add(new Car("Audi A3", "Hatchback", 4));
carsList.add(new Car("Tyrerell P34", "Formula One", 6));
carsList.add(new Car("1932 Morgan Aero 2-Seater Sports", "Sports", 3));
carsList.add(new Car("Avtoros Shaman", "All terrain", 8));

Затем мы можем отсортировать List<Car> следующим образом.

// By the type
carsList.sort(Comparator.comparing(Car::getType));

// By the number of tires
carsList.sort(Comparator.comparingInt(Car::getTires));

// By the number of tires in reverse order
carsList.sort(Comparator.comparingInt(Car::getTires).reversed());                   

// First by the type and then by the number of tires in reverse order
carsList.sort(Comparator.comparing(Car::getType).thenComparing(Car::getTires).reversed());

Другие вопросы по теме