Почему я могу передать объект сравнения в метод сортировки? - PullRequest
1 голос
/ 13 октября 2019

Из всех примеров методов сортировки, которые я видел, я никогда не сталкивался с примером, где они передают определение Comparator. Если компаратор предназначен для возврата отрицательного, положительного или 0 для сортировки объектов, что делает метод сортировки с этой информацией? Как метод sort получает значимую информацию из определения Comparator и выполняет свою операцию?

Вот такой метод сортировки:

    public void sort() {
        library.sort(new BookComparator());
    }

Вот весь класс Comparator:

import java.util.Comparator;

public class BookComparator implements Comparator<Book> {
    public int compare(Book a, Book b) {
        if(a == null || b == null) {
            throw new NullPointerException();
        }

        int result = 0 ;

        if(a.getAuthor() == null) {
            if(b.getAuthor() != null) {
                result = -1;
            }
        } else if(b.getAuthor() == null) {
            result = 1;
        } else {
            result = a.getAuthor().compareTo(b.getAuthor());
        }
        if(result !=0) {
            return result;
        }

        if(a.getTitle() == null) {
            if(b.getTitle() != null) {
                result = -1;
            }
        } else if(b.getTitle() == null) {
            result = 1;
        } else {
            result = a.getTitle().compareTo(b.getTitle());
        }

        if(result !=0) {
            return result;
        }

        if(a.getYear() < b.getYear()){
            return -1;
        } else if (a.getYear() == b.getYear()){
            return 0;
        } else {
            return 1;
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 13 октября 2019

Вы можете передать экземпляр Comparator в метод сортировки, чтобы вы могли сортировать по другим аспектам, кроме стандартного / естественного способа сортировки объекта.

Например, если у объекта Book есть естественная сортировкаможет быть основан на заголовке. Но что, если вы хотите отсортировать по десятичному числу Дьюи? Или на основании имени автора? Или количество страниц? Вы можете сделать это, написав Comparator, который сравнивает эти поля объекта Book.

Реальный алгоритм сортировки не должен знать сортируемый объект. Ему просто нужен компаратор, который является согласованным (то есть сравнения A B и B> A и т. Д.)

2 голосов
/ 13 октября 2019

Если компаратор предназначен для возврата отрицательного, положительного или 0 для сортировки объектов, что делает метод сортировки с этой информацией? Как метод сортировки получает значимую информацию из определения Comparator и выполняет свою операцию?

Метод сортировки на основе компаратора (такой как сортировка слиянием или пузырьковая сортировка) должен многократно рассматривать два элемента всобрать и решить, какой из них должен идти «первым». Это решение принимает компаратор, который возвращает «меньше», «больше» или «того же размера».

Этой информации достаточно, метод сортировки не должен понимать, какие объекты сортируются,Он может просто изменить порядок элементов в коллекции, пока все элементы «слева» не станут «меньше», чем элементы «справа».

Этот подход не работает для чего-то вроде «сортировки по сегментам», которая должна присваивать абсолютное числовое значение каждому элементу (а не только относительному значению по сравнению с другим элементом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...