Заказ по дате. Компаратор. Ява

следующий фрагмент, взятый из этого руководства по Java, сравнивает второй аргумент противиться первому, а не наоборот. *Метод HireDate() возвращает объект Date, обозначающий дату найма данного конкретного сотрудника.

import java.util.*;
public class EmpSort {
    static final Comparator<Employee> SENIORITY_ORDER = 
                                        new Comparator<Employee>() {
            public int compare(Employee e1, Employee e2) {
                return e2.hireDate().compareTo(e1.hireDate());
            }
    };

Вот объяснение учебника по Java:

Обратите внимание, что компаратор передает дату найма своего второго аргумента своему первому, а не наоборот. Причина в том, что сотрудник, который был нанят последним, является наименее старшим; сортировка в порядке даты найма поместит список в обратном порядке старшинства.

Тем не менее я не понимаю, почему инвертирование e1 и e2 в compareTo должно решить проблему.

Любые дополнительные разъяснения?

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


person Rollerball    schedule 02.04.2013    source источник


Ответы (3)


Естественный порядок дат (как определено compareTo) таков, что более поздняя дата "больше" более ранней. Для старшинства человек, который был там дольше, является более старшим, т. е. вы хотите, чтобы более ранняя дата начала означала больший старшинство, чем более поздняя.

Поскольку в контракте Comparator указано, что если compare(a,b) != 0, то compare(a,b) и compare(b,a) должны иметь противоположный знак, у вас есть два варианта реализации обратного упорядоченного сравнения a и b — либо возвращать -(a.compareTo(b)), либо b.compareTo(a) — они гарантированно имеют одинаковый знак.

Они не обязательно будут иметь одинаковое значение, но единственное, что имеет значение для результатов сравнения, это то, являются ли они >, < или == до 0, в то время как во многих примерах используются -1, 0 и +1 любое значение с правый знак в порядке.

person Ian Roberts    schedule 02.04.2013
comment
да, но как заранее узнать, кто из них старше? не должно быть так же? - person Rollerball; 02.04.2013
comment
в конце подсчитывается то, что ввел пользователь метода. - person Rollerball; 02.04.2013
comment
@Rollerball Я не понимаю, о чем ты спрашиваешь. Фрагмент кода, который вы предоставили в вопросе, - это просто способ определить компаратор, который может взять двух сотрудников и сказать вам, какой из них старше, выбрав тот, у которого более ранний hireDate(), он ничего не считает. - person Ian Roberts; 02.04.2013
comment
Я не понимаю, почему важно, что e2.hireDate().compareTo(e1.hireDate()) отличается от e1.hireDate().compareTo(e2.hireDate()). Я не знаю заранее, какой из двух объектов старший или младший (по старшинству). Я мог бы получить положительное или отрицательное значение из compareTo. - person Rollerball; 02.04.2013
comment
@Rollerball, если у вас есть список сотрудников и вы отсортировали этот список с помощью компаратора, который сделал e1.hireDate().compareTo(e2.hireDate()), вы бы расположили их в порядке от самого старшего к младшему (т.е. в обратном порядке старшинства). Если вы отсортируете по e2.hireDate().compareTo(e1.hireDate()), вы получите их в порядке от младшего к старшему. - person Ian Roberts; 02.04.2013

Если вы хотите изменить порядок сортировки, используйте:

Collections.sort(list, Collections.reverseOrder(comparator));

Не играйте с Компаратором.

person camickr    schedule 02.04.2013
comment
Это помогло сократить мои усилия вдвое. Спасибо. - person VPK; 04.01.2017

Метод компаратора compare ожидает возврата -1, 0 или 1, если e1<e2, e1==e2 или e1>e2. Поэтому, если окончательный порядок, который вы получаете, является обратным желаемому, просто инвертируйте a и b, чтобы решить проблему.

person Miguel Prz    schedule 02.04.2013
comment
да, но как заранее узнать, кто из них старше? не должно быть так же? - person Rollerball; 02.04.2013