Сортировка массивов в Java

Сортировка массивов в Java

1. обзор

В этом руководстве мы обсудим общие методы сортировкиarrays в порядке возрастания и убывания.

Мы рассмотрим использование Java-метода сортировки классовArrays, а также реализацию нашего собственногоComparator для упорядочивания значений наших массивов.

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

Прежде чем мы начнем, давайте быстро определим несколько массивов, которые мы будем отсортировать в этом руководстве. Сначала мы создадим массивints и массив строк:

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

И давайте также создадим массив объектовEmployee , в котором каждый сотрудник имеет атрибут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. Сортировка по возрастанию

Метод Javautil.Arrays.sort предоставляет нам быстрый и простой способ отсортировать массив примитивов или объектов, реализующих интерфейсComparable, в порядке возрастания.

При сортировке примитивов методArrays.sort  использует реализацию Dual-PivotQuicksort. Однако при сортировке объектов используется итеративная реализацияMergeSort.

3.1. Примитивы

Чтобы отсортировать примитивный массив в порядке возрастания, мы передаем наш массив методуsort :

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

3.2. Объекты, которые реализуют сопоставимые

Для объектов, реализующих синтерфейсComparable , как и в случае с нашим примитивным массивом, мы также можем просто передать наш массив методуsort:

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

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

Сортировка объектов, которые не реализуют интерфейсComparable Interface, как наш массивEmployees, требует от нас указания нашего собственного компаратора.

Мы можем сделать это очень легко в Java 8, указав свойство, которое мы хотели бы сравнить с нашими объектамиEmployee objects внутри нашегоComparator:

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

В данном случае мы указали, что хотим упорядочить наших сотрудников по их атрибутамname .

Мы также можем отсортировать наши объекты по более чем одному атрибуту, связав наши сравнения в цепочку с помощью методаComparator’s thenComparing :

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

4. Сортировка по убыванию

4.1. Примитивы

Сортировка примитивного массива в порядке убывания не так проста, как сортировка его в порядке возрастания, поскольку Java не поддерживает использование примитивных типовComparators on. Чтобы преодолеть этот недостаток, у нас есть несколько вариантов.

Во-первых, мы можемsort our array in ascending order and then do an in-place reversal массива.

Во-вторых, можно преобразовать наш массив в списокuse Guava’s Lists.reverse() method, а затем преобразовать наш список обратно в массив.

Наконец, мы можем преобразовать наш массив в песокStream , а затем отобразить его обратно в массивint. У него есть приятное преимущество:a one-liner and just using core 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 вInteger, которыйdoes реализуетComparator.

4.2. Объекты, которые реализуют сопоставимые

Сортировка массива объектов, реализующего синтерфейсComparable в порядке убывания, довольно проста. Все, что нам нужно сделать, это передатьComparator  как второй параметр нашего методаsort.

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

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

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

Аналогично сортировке объектов, которые реализуют сопоставимые, мы можем изменить порядок нашего настраиваемогоComparator , добавивreversed() at в конце нашего определения сравнения:

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

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

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

Как обычно, исходный код из этой статьи можно найтиover on Github.