JavaRush/Java блог/Архив info.javarush/Как правильно делать сортировку в Java
eGarmin
41 уровень

Как правильно делать сортировку в Java

Статья из группы Архив info.javarush
участников
Анализируя исходные коды многих opensource Java-проектов, я обнаружил, что большинство разработчиков осуществляют сортировку всего двумя разными способами. Один из них основан на применении метода sort() классов Collections или Arrays, а другой на использовании самосортирующихся структур данных, таких как TreeMap и TreeSet. Как правильно делать сортировку в Java - 1

Использование метода sort()

Если нужно отсортировать коллекцию, то применяйте метод Collections.sort().
// Collections.sort(…)
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
Если требуется отсортировать массив, используйте метод Arrays.sort().
// Arrays.sort(…)
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
Метод sort() очень удобен, когда коллекция или массив уже заполнены значениями.

Применение самосортирующихся структур данных

Если нужно отсортировать список (List) или множество (Set), используйте структуру TreeSet для сортировки.
// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedSet.addAll(unsortedSet);
Если вам требуется отсортировать словарь (Map), используйте структуру TreeMap для сортировки. TreeMap сортируется по ключу (key).
// TreeMap – использующий String ключи и компаратор (Comparator) CASE_INSENSITIVE_ORDER,
// упорядочивающий строки (String) методом compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap – общий случай, компаратор указывается вручную
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedMap.putAll(unsortedMap);
Вышеописанный подход очень полезен в тех случаях, если вам нужно проводить большое количество операций поиска элементов в коллекции. Самосортирующиеся структуры данных имеют эффективность O(log(n)), что лучше, чем O(n). Это означает, что при удвоении количества данных в коллекции время поиска не удваивается, а увеличивается на постоянную величину (прим. перев.)

Плохой подход к задаче сортировки

До сих пор можно встретить примеры, когда программисты самостоятельно описывают алгоритмы сортировки. Рассмотрим код сортировки, представленный ниже (сортировка double-массива по возрастанию (прим. перев.)). Этот код не только не эффективен, но и не читабелен. И таких примеров много.
double t;
for (int i = 0; i < N; i++)
	for (int j = i + 1; j < N; j++)
		if (r[j] < r[i]) {
			t = r[i];
			r[i] = r[j];
			r[j] = t;
		}
Комментарии (46)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Евгений N
Уровень 23
1 апреля 2022, 15:22
а что за кусок кода постоянно в примерах
public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
? похоже на какой то костыль, неужели в java нет конструкции читабельней?
ERGAN
Уровень 22
29 ноября 2020, 07:35
Прекрасный пример того, как можно было написать все и ничего в одной статье.
Николай
Уровень 23
17 июля 2020, 11:53
Статья на тему: "Глядите, лохи, как я крут!"
Dude QA Automation Engineer в Amazon
1 июля 2020, 19:21
То чувство, когда "Плохой подход к задаче сортировки" из вашей статьи, гораздо понятнее всего остального 😳
FuryCydonian
Уровень 22
27 января 2022, 21:58
Если понятнее последнее, то только потому, что еще не изучены эти методы. Потому что прописывать свои циклы вечно с этим частоколом из переменных и своими алгоритмами, которые могут быть еще и далеки от эффективности, читабельнее для нормальных программистов быть не могут же. Стоит изучить нормальные методы и они становятся понятнее и приятнее. Просто в статье нихрена не написано как их применять и как вообще на примере создается компаратор какой-нить)) А возможность задать свою логику сортировки (но не алгоритмы, алгоритмы в методах итак самые эффективные какие могли придумали скорее всего там) это очень важно бывает) И кстати в метод sort() можно не передавать же компаратор, а просто написать что-то типа list.sort(null); или Collections.sort(list); и он отсортируется по умолчанию. От меньшего к большему, если числа, или по алфавиту, если строки.
Виталий
Уровень 9
4 марта 2020, 12:59
Ребята!!!!! Объясните логику сортировки пожалуйста, я не догоняю вообще в чем прикол. что с чего начать, куда смотреть. У меня задание типа электронной книги. 1.если ввожу номер телефона , просит ввести имя 2.если ввожу имя просит ввести номер телефона 3. если ввожу существующее имя или существующий номер телефона, программа выдает полностью контакт. 4. при команде LIST должен распечататься весть список контактов 5. при распечатке все контактов , имена должны быть отсортированы в алфавитном порядке Сделал все пункты кроме последнего. Использовал коллекцию TreeMap, но дело в том что номера телефонов у меня ключи, а имена это значения. TreeMap в этой беде не поможет. я вообще догнать не могу как мне отсортировать значения в MAP.
Kazantip
Уровень 32
11 февраля 2020, 17:38
Вот нормальная статья с примерами выполнения сортировки: https://hr-vector.com/java/sortirovka-arraylist
FuryCydonian
Уровень 22
27 января 2022, 22:01
Да, прикольно. Но подходит не ко всем случаям. Когда надо задать свою логику сортировки она не поможет. И тогда за незнанием того, как работать с компараторами как в статье (я щас сама пойду разбираться, как они там пишутся), люди идут писать обычный императивный старый добрый цикл с счетчиками. Ну, мне так видится.
Maksim Demin
Уровень 0
11 января 2020, 17:26
Люди добрые! Помогите отсортировать коллекцию (например) TreeMap<String, String> map map.put("1", "Строка1"); map.put("2", "Строка2"); map.put("4", "Строка4"); map.put("10", "Строка10"); map.put("11", "Строка11"); map.put("15", "Строка15"); Чтобы сортировка при выводе была ни как у меня сейчас 1 строка 1 10 строка 10 11 строка 11 15 строка 15 2 строка 2 4 строка 4 надо чтобы цифры были по порядку
Yerzhan
Уровень 29
25 января 2020, 17:20
просто вводи значения ключей в зависимости от разрядности твоих данных, то есть если макс число будет трехзначное то данные должны быть 001, 010, 042, 112 и получишь: 001=Строка1 002=Строка2 004=Строка4 010=Строка10 011=Строка11 042=Строка42 115=Строка115 415=Строка415
Ирина
Уровень 8
29 ноября 2019, 10:57
Странно, что при написании статьи автор не указал, что выводится на экран исходя из его кода. Я впервые сталкиваюсь сортировками и совсем не понимаю, как сортируют описанные им методы, по какому принципу? (больше-меньше, по алфавиту или как?). Ничего не понятно.
Александр
Уровень 13
6 мая 2019, 15:56
Как вообще узнать, что писать в импорте, чтобы подключить коллекции? ни черта нигде нет об этом, а без импорта код не работает. черт возьми, где его взять? почему бы не сделать хоть какой то навигатор по классам? p.s. я на 7-м уровне и у меня нет возможности глянуть в шапку заготовки уроков последующих уровней
Ihor Full Stack Developer
14 июля 2019, 20:40
когда пишешь коллекцию, да и любой метод, библиотеку которого надо подключать, либо не дописывая выбери из списка нужное и нажми enter, либо когда ввел и подчеркивает ошибку - alt+enter
Andrey Pushkarev
Уровень 35
2 марта 2019, 09:48
Если нужно отсортировать список (List) или множество (Set), используйте структуру TreeSet для сортировки может я чего не уловил... каким образом предлагается отсортировать список, запихав его в Treeset?
Глеб
Уровень 20
4 апреля 2019, 08:21
если не ошибаюсь эта структура сама по себе хранит данные в отсортированном порядке. А если вы занесете данные в LinkedHashSet, то они будут располагаться в том порядке в котором вы их туда положили