Я делаю вопрос самотестирования из книги Кэти и Сейрры. Один из вопросов пошел не так, поэтому я пытался в IDE. Мое замешательство можно найти на этом изображении. Главный вопрос, когда я отлаживал его, я поставил точку отладки в методе сравнения. Если всплывающая подсказка может быть замечена, o1 содержит значение pen. Я думал, что o1 должен быть картой, а o2 - ручкой. Может ли кто-нибудь объяснить мне эту путаницу?Метод сравнения сравнения() сортировка путаницы
ответ
Я не знаю, почему вы ожидаете o1 должны быть карта и o2 должна быть ручка. Для этого нет никакой гарантии, и на самом деле вам не следует заботиться об этом, когда вы применяете метод compare()
.
Вы можете проверить источник метода Arrays.sort на grepcode и понять его лучше:
Порядок не имеет значения, когда вы реализуете Comparator, вы просто должны соответствовать тому, что Договор класса и реализовать его по мере необходимости. Вы можете только вывести порядок вызовов, зная ввод и реализацию.
Просто для полноты картины, от OpenJDK 7, это реализация Arrays.sort
, который использует сортировка слиянием (анализ ниже):
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);
}
И Arrays::mergeSort
:
private static final int INSERTIONSORT_THRESHOLD = 7;
private static void mergeSort(Object[] src,
Object[] dest,
int low, int high, int off,
Comparator c) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
for (int i=low; i<high; i++)
for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
swap(dest, j, j-1);
return;
}
// Recursively sort halves of dest into src
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
mergeSort(dest, src, low, mid, -off, c);
mergeSort(dest, src, mid, high, -off, c);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (c.compare(src[mid-1], src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
// Merge sorted halves (now in src) into dest
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
В вашем примере , это верно: length < INSERTIONSORT_THRESHOLD
, поэтому сортировка вставки будет фактически выполнена для этого небольшого массива из 4 элементов.
Редактировать: Неверный mergeSort, исправлено.
спасибо за ответ. Мне нужно понять, что сортировка слияния в глубине понимает все это. – benz
Как возник вопрос? Каков был исходный вопрос?
Arrays.sort (Object []) использует Mergesort, но это не имеет большого значения, если все, о чем вы беспокоитесь, получает отсортированный массив. Если вы согласны с требованиями интерфейса Comparator (http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html), ваш массив будет отсортирован правильно.
- 1. Сортировка места: Метод сравнения нарушает его генподряд
- 2. Сортировка после сравнения
- 3. Сортировка без сравнения элементов
- 4. Метод сравнения сравнительного сравнения с использованием double?
- 5. Встроенная сортировка сравнения в Java
- 6. VS2010 Исходные данные сравнения сравнения сравнения сравнения профилей сравнения
- 7. Метод для сравнения объектов
- 8. Используйте метод сравнения списков
- 9. Java: метод сравнения классов
- 10. Какой метод сравнения лучше?
- 11. Метод сравнения сигналов
- 12. Сортировка с помощью функции сравнения
- 13. Ошибка сравнения сравнения
- 14. Сортировка ArrayList: метод сравнения нарушает его общий контракт
- 15. Отладка «Метод сравнения нарушает общий контракт!»
- 16. Метод сравнения нарушает его общий контракт! На основе сравнения карт
- 17. Метод описательного имени для простого сравнения или сравнения напрямую?
- 18. C++ как сортировать, используя метод сравнения без сравнения
- 19. Просьба пояснить этот метод сравнения
- 20. Метод сравнения переменной в Java
- 21. метод сравнения строк в php
- 22. Метод сравнения строк, используемый Python
- 23. Метод сравнения бросков Генподрядные исключение
- 24. Почему метод сравнения NSNumber отличается?
- 25. Вызов сравнения Метод другого класса
- 26. Метод сравнения нарушает общий контракт
- 27. Почему метод сравнения не работает?
- 28. Как использовать метод сравнения Collections
- 29. список сравнения метод с массивом
- 30. Переопределение сравнения и сравнения в java7
Почему вы ожидаете, что вызовы 'compare' должны быть сделаны с аргументами в любом конкретном порядке? – user2357112
Я ожидаю, потому что либо ожидаю восходящего поведения, либо спускаюсь. Простые слова отсортированы, поэтому именно этот quesiton – benz
Любой порядок сортировки может быть выполнен с помощью аргументов 'compare' в любом порядке. Не имеет значения, выполняете ли вы эквивалент 'a < b' or 'b > a'. – user2357112