2014-02-12 5 views
0

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

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?

Update:

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

+3

читать Java док компаратора. это объяснит alot –

+0

Справа и прочитайте javadoc для 'Collections.sort'. – pamphlet

+1

Что возвращает 'o22.getHandledDate()'? Если он не возвращает 'String', тогда код не должен компилироваться. И если он возвращает 'String', а имя метода немного неуместно. –

ответ

1

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

Это то, что здесь делает этот звонок.

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

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

+0

Что происходит, когда вызывается 'new MyComparator()'? Вызывается метод 'compare' автоматически? Этот класс не имеет конструктора по умолчанию. – Prince

+0

Экземпляр создается и передается методу сортировки. Прочтите javadoc для 'sort'. – pamphlet

+1

Каждый класс имеет неявный конструктор по умолчанию, если вы не определяете конструкторы. Не беспокойтесь об этом. –

1

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

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

так куб.см должны всеми правами быть -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()); 
     } 
    }); 
} 
+0

Спасибо! Мне также нужно переопределить 'equals' для' MyComparator'? – Prince

1

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

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

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

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

+0

Спасибо! Не могли бы вы объяснить, как метод 'compare' вызван просто путем создания нового экземпляра' MyComparator'? – Prince

+0

@ Принц, как работает метод 'Collections.sort'. Для этого требуется «Comparator», который является интерфейсом, который гарантирует наличие метода «compare (o1, o2)». – ashes999

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

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

Хитрая часть понимания возвращаемого значения метода String.compareTo используется . Она определяется в Comparable interface

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

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

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

+0

«Используемый метод String.compareTo. Он определен в интерфейсе Comparable». - Он не определен в интерфейсе Comparable, но это метод класса String. – Prince

+0

@ Принц Да и нет. Конечно, точное возвращаемое значение функции определено в классе String. Но String реализует интерфейс Comparable, который говорит об этом методе: «Сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку этот объект меньше, равен или больше указанного объекта. ' – SebastianH

Смежные вопросы