Как отсортировать массив
Короткий ответ
Arrays.sort() сортирует массив на месте по возрастанию:
void main() {
int[] numbers = {10, 9, 1, 100};
Arrays.sort(numbers);
IO.println(Arrays.toString(numbers));
}Результат:
[1, 9, 10, 100]По убыванию
Компаратор работает только с объектами, поэтому массив должен быть Integer[], а не int[]:
void main() {
Integer[] numbers = {10, 9, 1, 100};
Arrays.sort(numbers, Comparator.reverseOrder());
IO.println(Arrays.toString(numbers));
}Результат:
[100, 10, 9, 1]Строки
Строки сортируются по кодам символов — заглавные буквы раньше строчных. Для сортировки без учёта регистра есть готовый компаратор:
void main() {
String[] words = {"pear", "apple", "Banana"};
Arrays.sort(words);
IO.println(Arrays.toString(words));
Arrays.sort(words, String.CASE_INSENSITIVE_ORDER);
IO.println(Arrays.toString(words));
}Результат:
[Banana, apple, pear]
[apple, Banana, pear]По полю объекта
Comparator.comparing() создаёт компаратор по значению поля:
record User(String name, int age) {}
void main() {
User[] users = {new User("Anna", 30), new User("Oleg", 25)};
Arrays.sort(users, Comparator.comparing(User::age));
IO.println(Arrays.toString(users));
}Результат:
[User[name=Oleg, age=25], User[name=Anna, age=30]]Не менять исходный массив
Arrays.sort() меняет сам массив. Чтобы сохранить исходный порядок, отсортируйте копию:
void main() {
int[] numbers = {3, 1, 2};
int[] sorted = numbers.clone();
Arrays.sort(sorted);
IO.println(Arrays.toString(numbers));
IO.println(Arrays.toString(sorted));
}Результат:
[3, 1, 2]
[1, 2, 3]Частая ошибка
Передать компаратор вместе с int[]. Для массивов примитивов такого метода нет:
void main() {
int[] numbers = {3, 1, 2};
Arrays.sort(numbers, Comparator.reverseOrder());
}Результат:
Main.java:3: error: no suitable method found for sort(int[],Comparator<T#1>)Используйте Integer[] или отсортируйте по возрастанию и пройдите массив с конца.
Функции из этого ответа
- Arrays.sort() — Сортирует массив на месте — по возрастанию или по заданному компаратору.
- Comparator.reversed() — Возвращает компаратор с обратным порядком. Для естественного порядка есть Comparator.reverseOrder().
- Comparator.comparing() — Создаёт компаратор, который сравнивает объекты по одному полю.