Сортировка массивов в Java
1. обзор
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.