2011-12-26 2 views
2

Я новичок в java, и я пытаюсь понять приведенный код here.Внедрить компаратор в java

Что я не понимаю, так это то, что в этом классе StringLengthComparator они образуют «скелет» для сравнения двух объектов: String o1, String o2.

Однако, когда они применяют класс, есть 6 строк, которые передаются в StringLengthComparator и дает правильный результат.

Вопрос в том, как происходит сравнение только двух объектов в классе, но когда 6 строк переданы, он дает правильный результат?

Очевидно, что здесь отсутствует что-то фундаментальное, и поэтому любое руководство по этому вопросу было бы замечательным.

+0

Взгляните на http://docs.oracle.com/javase/tutorial/collections/algorithms/index.html – adatapost

ответ

1

Вопрос мой, когда только два объекта сравниваются в классе, но когда передано 6 строк, он дает правильный результат?

.compare метод The ​​объекта сравнивает две строки в то время. Метод Arrays.sort вызывает .compare на поставляемом объекте несколько раз, передавая ему разные пары строк из полного набора 6, используя полученную информацию для сортировки массива.

+0

Удивительно: Это именно то объяснение, которое я искал. Я пришел из фона matlab/python, так что это было ново для меня. Еще раз спасибо. – JasonB

+0

... Я не могу говорить о Matlab, но он работает ** так же ** в Python. Java 'Arrays.sort' аналогичен методу' sort' на объектах 'list' в Python. Объект компаратора аналогичен вызываемому объекту, переданному в этот метод (теперь устаревший) аргумент ключевого слова 'cmp'. Однако Java не имеет ничего общего с '__call__', поэтому вместо него используется определенная именованная функция (а имя для использования продиктовано интерфейсом' Comparator'). –

0

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

2

Компаратор (используется в коллекциях в java), который используется для указания параметра сортировки, например, длины или алфавитного порядка или т. Д. По умолчанию он сравнивается по алфавиту для строк, поэтому, если вы хотите сравнить две строки по длине, тогда он будет сравнивать его по длине с помощью переопределения компаратора.

Arrays.sort(strs, new StringLengthComparator()); 

сортирует массив строк для каждого элемента в массиве с STRs указания компаратора StringLengthComparator, который говорит, что параметр Comparision будет длиной строки.

0

В основном, массив строк (6 строк) не передается StringLengthComparator но Arrays.sort, который использует StringLengthComparator сравнить Струны по одному и сортировки массива

0

В конечном счете, это то, как Arrays.sort является реализованы. Вы можете look at the Java 6 API, но вас это не устраивает, пока вы не посмотрите на source code для себя - проверьте файл /jdk/src/share/classes/java/util/Arrays.java в каталоге исходного кода.

Что этот метод делает, это взять массив, а затем Компаратор, а затем запустить версию сортировки слияния по всему массиву с помощью этого компаратора. Вам будет хорошо подано, если вы заглянете в mergesort, чтобы полностью понять природу этого метода.

Вот фрагмент кода, так как Java 6/7 является открытым исходным кодом. Опять же, посмотрите на mergesort, и вы сможете понять, почему это работает так, как оно.


public static <T> void sort(T[] a, Comparator<? super T> c) { 
    T[] aux = (T[])a.clone(); 
    if (c==null) 
     mergeSort(aux, a, 0, a.length, 0); 
    else 
     mergeSort(aux, a, 0, a.length, 0, c); 
} 
1

внутренний алгоритм сортировки Java (или любой алгоритм сортировки по этому вопросу) должен знать, как сортировать, кроме примитивов объектов.

Например, java знает, как отсортировать массив из integers, потому что он имеет установленный естественный порядок. [Для любой последовательности целых чисел (a, b) a придет до b, если a меньше b] Это неверно для всех объектов, которые могут быть созданы пользователем. Поэтому для этих объектов мы должны сообщить java о том, как сортировать, и для этой цели используется Comparator.compare().

Как любой алгоритм сортировки должен знать, как сравнить только two объекты одного и того же типа, два параметра много для Comparator.compare()

1

Когда вы создаете нечто вроде StringLengthComparator, вы разработчик реализации:

int compare(T o1, T o2) 

метод в качестве части контракта на реализацию интерфейса Comparator. При встрече с любыми двумя объектами T этот метод возвращает 1, 0 или -1 в зависимости от того, если o1 больше или равно o2, соответственно.

При правильном применении, это единственное требование для любого сортировочного алгоритма быть обобщенно вставлено в ваш код, будь то его mergesort, quicksort, или любой другой сортировку рутины вы можете думать.

Arrays класс использует это свойство при вызове:

static void sort(Object[] a, Comparator c) 

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

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