Рубрики
Без рубрики

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

Узнайте, как сортировать массивы или примитивные типы и объекты в порядке возрастания и убывания

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

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

И давайте также создадим массив объектов Employee , где каждый сотрудник имеет id и имя атрибут:

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. Сортировка по возрастанию

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

При сортировке примитивов При сортировке примитивов метод использует реализацию двойного поворота Быстрая сортировка . Однако при сортировке объектов итеративная реализация 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[] { "baeldung", "java", "learning", "with" }, strings);

3.3. Объекты, Которые Не Реализуют Сопоставимые

Сортировка объектов, которые не реализуют Сравнимый Интерфейс, как и наш массив Работники , , требует, чтобы мы указали ваш собственный компаратор.

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

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

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

Мы также можем сортировать объекты по нескольким атрибутам, изменяя наши сравнения с помощью Компараторы Затем сравнение метод:

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

4. Сортировка в порядке убывания

4.1. Примитивы

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

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

Во-вторых, можно преобразовать наш массив в список, используя метод 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 в Целое число , которое реализует Компаратор.

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

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

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

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

4.3. Объекты, Которые Не Реализуют Сопоставимые

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

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

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

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

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