JavaRush /Java блог /Random UA /Як правильно робити сортування в Java
eGarmin
41 рівень

Як правильно робити сортування в Java

Стаття з групи Random UA
Аналізуючи вихідні коди багатьох 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;
		}
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ