Сортиране на масиви в Java

1. Общ преглед

В този урок ще обсъдим общи методи за сортиране на масиви във възходящ и низходящ ред.

Ще разгледаме използването на метода за сортиране на клас Arrays на Java, както и внедряването на наш собствен Comparator за подреждане на стойностите на нашите масиви.

2. Определения на обекти

Преди да започнем, нека бързо дефинираме няколко масива, които ще сортираме в този урок. Първо ще създадем масив от ints и масив от низове:

int[] numbers = new int[] { -8, 7, 5, 9, 10, -2, 3 }; String[] strings = new String[] { "learning", "java", "with", "baeldung" };

И нека също така създадем масив от обекти на служители, където всеки служител има атрибут id и name :

Employee john = new Employee(6, "John"); Employee mary = new Employee(3, "Mary"); Employee david = new Employee(4, "David"); Employee[] employees = new Employee[] { john, mary, david };

3. Сортиране във възходящ ред

Методът util.Arrays.sort на Java ни предоставя бърз и лесен начин за сортиране на масив от примитиви или обекти, които реализират сравнимия интерфейс във възходящ ред.

При сортиране на примитиви, методът Arrays.sort използва Dual-Pivot реализация на Quicksort. При сортиране на обекти обаче се използва итеративно изпълнение на MergeSort.

3.1. Примитиви

За да сортираме примитивен масив във възходящ ред, предаваме нашия масив на метода на сортиране :

Arrays.sort(numbers); assertArrayEquals(new int[] { -8, -2, 3, 5, 7, 9, 10 }, numbers); 

3.2. Обекти, които се изпълняват, сравними

За обекти, които изпълняват сравнимия интерфейс, както при нашия примитивен масив, можем също така просто да предадем нашия масив на метода на сортиране :

Arrays.sort(strings); assertArrayEquals(new String[] { "baeldung", "java", "learning", "with" }, strings);

3.3. Обекти, които не се изпълняват, сравними

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

Можем да направим това много лесно в Java 8, като посочим свойството, с което бихме искали да сравняваме нашите обекти на служители в рамките на нашия Comparator:

Arrays.sort(employees, Comparator.comparing(Employee::getName)); assertArrayEquals(new Employee[] { david, john, mary }, employees);

В този случай, ние сме уточни, че ние бихме искали да поръчате нашите служители от техните имена атрибути.

Също така можем да сортираме обектите си по повече от един атрибут, като свързваме сравненията си с помощта на метода на Comparator thenComparing :

Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId));

4. Сортиране в низходящ ред

4.1. Примитиви

Сортирането на примитивен масив в низходящ ред не е толкова просто, колкото сортирането във възходящ ред, тъй като Java не поддържа използването на Comparators за примитивни типове. За да преодолеем този недостиг, имаме няколко възможности.

Първо, можем да сортираме нашия масив във възходящ ред и след това да извършим обръщане на масива на място.

Второ, може да преобразува нашия масив в списък, да използва метода на Guava Lists.reverse () и след това да преобразува нашия списък обратно в масив.

И накрая, можем да трансформираме нашия масив в поток и след това да го преобразуваме обратно в масив int . Има хубаво предимство, че е еднолинеен и просто използва основната Java:

numbers = IntStream.of(numbers).boxed().sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray(); assertArrayEquals(new int[] { 10, 9, 7, 5, 3, -2, -8 }, numbers);

Причината това да работи е, че boxed превръща всеки int в цяло число , което все пак реализира Comparator.

4.2. Обекти, които се изпълняват, сравними

Сортирането на масив от обекти, който реализира сравнимия интерфейс в низходящ ред, е доста просто. Всичко, което трябва да направим, е да предадем Comparator като втори параметър на нашия метод за сортиране .

В Java 8 можем да използваме Comparator.reverseOrder (), за да посочим, че бихме искали нашият масив да бъде сортиран в низходящ ред:

Arrays.sort(strings, Comparator.reverseOrder()); assertArrayEquals(new String[] { "with", "learning", "java", "baeldung" }, strings);

4.3. Обекти, които не се изпълняват, сравними

Подобно на сортирането на обекти, които изпълняват сравними, можем да обърнем реда на нашия персонализиран Comparator, като добавим reversed () в края на нашата дефиниция за сравнение:

Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed()); assertArrayEquals(new Employee[] { mary, john, david }, employees);

5. Заключение

В тази статия обсъдихме как да сортираме масиви от примитиви и обекти във възходящ и низходящ ред, използвайки метода Arrays.sort .

Както обикновено, изходният код от тази статия може да бъде намерен в Github.