Нужна помощь в понимании этого метода

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

static void sortByDate( List list)   throws Exception
{  
    class MyComparator implements Comparator {

        public int compare(Object o1, Object o2) {

            RQEntry  o11 = (RQEntry) o1;
            RQEntry  o22 = (RQEntry) o2;

            int cc = ((String)o11.getHandledDate() ).compareTo(o22.getHandledDate() );

            return (cc < 0 ? -1 : cc > 0 ? 1 : 0);
        }
    };

    Collections.sort(list, new MyComparator());
}

Вопрос 1. Может ли кто-нибудь объяснить, как этот метод выполняет сравнение?

Вопрос 2. Какие параметры универсального типа следует передавать для соответствия стандартам Java 5?

Вопрос 3. Как вызвать метод compare, просто создав новый экземпляр MyComparator?

Обновление:

Только что нашел эту ссылку, которая, наконец, помогла мне понять этот код: http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html


person Prince    schedule 12.02.2014    source источник
comment
прочитайте java-документ компаратора. это многое объяснит   -  person Philipp Sander    schedule 12.02.2014
comment
Правильно, и прочитайте javadoc для Collections.sort.   -  person pamphlet    schedule 12.02.2014
comment
Что возвращает o22.getHandledDate()? Если он не возвращает String, код не должен компилироваться. А если вернет String, то и имя метода немного неподходящее.   -  person Rohit Jain    schedule 12.02.2014
comment
Почему тип возвращаемого значения String делает имя метода неподходящим? Похоже, что он сортируется (в алфавитном порядке) по дате обработки.   -  person pamphlet    schedule 12.02.2014
comment
Хотя это личный выбор, но IMO, getHandledDate действительно должен возвращать Date, а не String.   -  person Rohit Jain    schedule 12.02.2014


Ответы (4)


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

Вот что делает этот звонок.

Collections.sort(list, new MyComparator());

В фоновом режиме, когда алгоритму сортировки необходимо сравнить
два объекта RQEntry, он вызывает метод compare вашего компаратора
. Это все.

person peter.petrov    schedule 12.02.2014
comment
Что происходит, когда вызывается new MyComparator()? Вызывается ли метод compare автоматически? Этот класс не имеет конструктора по умолчанию. - person Prince; 12.02.2014
comment
Экземпляр создается и передается методу сортировки. Прочтите javadoc для sort. - person pamphlet; 12.02.2014
comment
Каждый класс имеет неявный конструктор по умолчанию, если конструкторы не определены. Не беспокойтесь об этом. - person peter.petrov; 12.02.2014
comment
Итак, метод compare вызывается просто путем создания нового экземпляра MyComparator? Как? - person Prince; 12.02.2014
comment
Нет нет. Он вызывается при вызове sort. И он вызывается не один раз, а каждый раз, когда sort нужно сравнить два объекта. - person peter.petrov; 12.02.2014

Этот код позволяет сортировать List по дате. Предполагается, что List на самом деле является List<RQEntry>.

Java позволяет вызывать Collections.sort(list, new SomeComparator()). Компаратор, который вы указываете во втором аргументе, содержит код, который решает, как упорядочивать элементы в списке.

Фактический интерфейс сравнения заключается в том, что вам нужно реализовать int compare(Object o1, Object o2). Согласно спецификации, вам необходимо вернуть 0, если два объекта одинаковы, отрицательное значение, если первый элемент заказан перед вторым элементом, и положительное значение, если второй элемент заказан перед первым.

Например, если у вас есть список, содержащий [37, 19], то вызов compare(37, 19) вернет 1 (при условии, что вы хотите отсортировать список целых чисел в порядке возрастания).

person ashes999    schedule 12.02.2014
comment
Спасибо! Не могли бы вы объяснить, как вызывается метод compare, просто создавая новый экземпляр MyComparator? - person Prince; 12.02.2014
comment
@Принц, вот как работает метод Collections.sort. Для этого требуется Comparator, который является интерфейсом, гарантирующим наличие метода compare(o1, o2). - person ashes999; 12.02.2014

Ответ 1: выполняется сравнение строк между тем, что возвращается из метода getHandleDate. Я понятия не имею, почему это делается:

return (cc < 0 ? -1 : cc > 0 ? 1 : 0);

так как cc по всем правилам должен быть -1, 0 или 1. Код может так же легко сделать:

return ((String)o11.getHandledDate()).compareTo(o22.getHandledDate());

Ответ 2. Вы можете использовать дженерики для упрощения следующим образом:

static void sortByDate(List<RQEntry> list)   throws Exception
{  
    Collections.sort(list, new Comparator<RQEntry> {
        public int compare(RQEntry o1, RQEntry o2) {
            return ((String)o1.getHandledDate()).compareTo(o2.getHandledDate());
        }
    });
}
person mikea    schedule 12.02.2014
comment
Спасибо! Нужно ли мне также переопределять equals для MyComparator? - person Prince; 12.02.2014

Question 1: Could someone explain how this method performs comparison?

Для каждого объекта вызывается метод getHandledDate() и сравниваются возвращаемые значения (очевидно, Strings) (сравнение по умолчанию выполняется в лексикографическом порядке.

Сложность заключается в понимании возвращаемого значения используемого метода String.compareTo. Он определяется в интерфейсе Comparable.

Question 2: What generic type parameters should be passed to comply with Java 5 standards?

Общий тип, очевидно, должен быть RQEntry. -> class MyComparator implements Comparator<RQEntry>.

Смотрите также:

person SebastianH    schedule 12.02.2014
comment
Используется метод String.compareTo. Он определяется в интерфейсе Comparable. - Он не определен в интерфейсе Comparable, но является методом класса String. - person Prince; 12.02.2014
comment
@Принц Да и нет. Конечно, точное возвращаемое значение функции определяется в классе String. Но String реализует интерфейс Comparable, что говорит о методе следующее: 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. - person SebastianH; 12.02.2014