Подтвердить что ты не робот

Каков порядок сортировки Java Collections.sort(список, компаратор)? от малого до большого или большого до малого?

По-видимому, он не задокументирован или я его пропустил.

Здесь ссылка на документацию и под текстом в виде изображения:

EDIT (17/5): Я думаю, слишком много путают этот вопрос как вопрос компаратора. Это не. Компаратор сравнивает два элемента. Согласно этому сопоставлению список отсортирован. Как? По возрастанию или по убыванию?

Я уточню/упрощу еще вопрос: если компаратор решает, что элемент A меньше элемента B. В отсортированном списке, элемент A будет располагаться с меньшим индексом, чем элемент В?

enter image description here

4b9b3361

Ответ 1

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

Из документации для Collections.sort(Список <T> список,           Компаратор <? супер T > c):

Сортирует указанный список в соответствии с порядком, вызванным указанным компаратором.

Из документации для Comparator.compare(T, T):

Сравнивает два аргумента для порядка. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равен или больше второго.

Ответ 2

Вы (или, точнее, ваш компаратор) решают.

  • Если ваш Comparator compare(T o1, T o2) возвращает отрицательное значение, если o1 меньше o2, вы получаете возрастающий порядок (demo on ideone).
  • Если ваш Comparator compare(T o1, T o2) возвращает отрицательное значение, когда o1 больше, чем o2, вы получаете убывающий порядок (demo on ideone).

Другим способом сказать то же самое было бы то, что sort предполагает, что компаратор упорядочивает два элемента, переданные в него от меньшего (o1) до большего (o2), и создает восходящую сортировку, согласующуюся с этим упорядочение.

Ответ 3

Документация метода Comparator.compareTo(o1, o2) сообщает

Сравнивает два аргумента для порядка. Возвращает отрицательное целое число, нуль или положительное целое число, поскольку первый аргумент меньше, равный или больше, чем второй.

Итак, если вы хотите сортировать из естественного заказа, то есть от малого до большого, тогда вы должны написать реализацию, определенную в документации

public int compareTo(Integer o1, Integer o2) {
     int v1 = (o1);
     int v2 = (o2);
     if(v1 == v2) {
        return 0;
     }
     if(v1 < v2) {
        return -1; //return negative integer if first argument is less than second
     }
     return 1;
}

Если вы хотите, чтобы сортировка была в обратном порядке, это большая до маленькой

public int compareTo(Integer o1, Integer o2) {
     int v1 = (o1);
     int v2 = (o2);
     if(v1 == v2) {
        return 0;
     }
     if(v1 < v2) {
        return 1;  //do the other way
     }
     return -1;
}

Ответ 4

Согласно документация https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator, реализация sort для Collections.sort(list, comparator) - это mergeSort.

Учитывая результат, полученный с помощью mergeSort, возрастает (https://en.wikipedia.org/wiki/Merge_sort), порядок сортировки Collections.sort(list, comparator) Восходящий.

То есть, если компаратор решает, что элемент A меньше элемента B. В отсортированном списке элемент A будет располагаться с меньшим индексом, чем элемент B.