Как понять порядок, индуцированный компаратором в Java? - PullRequest
0 голосов
/ 22 декабря 2018

Я был так смущен компаратором и Collections.sort () в Java. Я не понимаю порядок, вызванный компаратором .Я не понимаю, какое число должна возвращать функция сравнения, чтобы получить направление сортировки.Я также не знаю, как Коллекции будут использовать этот результат сравнения для сортировки входных данных.Должен ли я выучить их наизусть?Есть ли что-нибудь проще для их понимания?Кто-нибудь может объяснить это для меня?Благодарю.

public int compare(Obj a, Obj b){ 
    if(a.age > b.age) return 1; 
    if(a.age < b.age) return -1;
    else              return 0;
}

Обновление

Получив некоторые объяснения от дружественного инженера-программиста, я понял, что компаратор определяет порядок элементов в коллекциях.Например, когда сравниваются a и b, если компаратор возвращает -1, тогда a следует поставить перед b в списке.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

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

Представьте, что вам дано задание:сортировка ниже чисел вручную.

4, 2, 7, 8, 3

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

Точно так же, чтобы выполнить задачу сортировки, компьютер должен сравнить пары предметов искажем, что «больше», а что «меньше».

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

0 голосов
/ 22 декабря 2018

Шаг 1

Одним из способов упростить и сопоставить это может быть то, что ваш код:

public int compare(Obj a, Obj b){ 
    if(a.age > b.age) return 1; 
    if(a.age < b.age) return -1;
    else              return 0;
}

будет представлен следующим образом (учитывая age это int переменная)

public int compare(Obj a, Obj b) {
    return Integer.compare(a.getAge(), b.getAge());
}

, где Integer.compare внутренне выполняет ту же логику, что вы делали ранее:

return (x < y) ? -1 : ((x == y) ? 0 : 1)

Шаг 2

Теперь это может привести кбыть представленным с использованием компаратора в виде:

Comparator<Obj> ageComparator = Comparator.comparingInt(Obj::getAge);

, который Comparator.comparingInt внутренне выполняет

return (Comparator<T> & Serializable)
        (c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));

Следовательно, порядок, в конечном итоге индуцированный всеми этими тремя формами, будет одинаковымнапример, когда вы вызываете

objList.sort(ageComparator);

Comparable, метод compareTo может более подробно рассказать о сравнении

Compares this object with the specified object for order.  Returns a
negative integer, zero, or a positive integer as this object is less
than, equal to, or greater than the specified object.

и, следовательно, это считается естественным порядком из Obj, когда вы переопределяете compareTo, расширяющийся до Comparable<Obj>.

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