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 .