Как отсортировать массив или список
Массив — Arrays.sort, список — Collections.sort (или list.sort). Оба сортируют на месте — меняют сам массив или список — и по возрастанию:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
int[] numbers = {5, 2, 9, 1, 7};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
List<String> names = new ArrayList<>(List.of("Олег", "Анна", "Борис"));
Collections.sort(names);
System.out.println(names);
}
}[1, 2, 5, 7, 9]
[Анна, Борис, Олег]Строки сортируются по алфавиту, числа — по величине. Часть массива — Arrays.sort(a, from, to), где to не включается.
По убыванию
Для списка:
names.sort(Collections.reverseOrder());Для массива Arrays.sort(a, Collections.reverseOrder()) работает только с массивом объектов — Integer[], а не int[]:
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
Integer[] numbers = {5, 2, 9, 1, 7};
Arrays.sort(numbers, Collections.reverseOrder());
System.out.println(Arrays.toString(numbers));
}
}[9, 7, 5, 2, 1]С int[] такая строка не скомпилируется. Отсортируйте int[] по возрастанию и пройдите его с конца или переставьте элементы в обратном порядке.
По своему правилу
Правило сортировки задаёт компаратор (Comparator). Например, слова по длине:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> words = new ArrayList<>(List.of("кот", "слон", "ёж", "жираф"));
words.sort(Comparator.comparing(String::length));
System.out.println(words);
words.sort(Comparator.comparing(String::length).reversed());
System.out.println(words);
}
}[ёж, кот, слон, жираф]
[жираф, слон, кот, ёж]String::length — короткая запись «взять длину строки». Объекты своего класса сортируют так же — по нужному полю:
students.sort(Comparator.comparing(Student::getName));
students.sort(Comparator.comparingInt(Student::getAge).reversed());Здесь getName и getAge — геттеры класса Student. Второе правило можно добавить через thenComparing.
Если у объектов есть один естественный порядок, класс может реализовать интерфейс Comparable с методом compareTo — тогда Collections.sort(list) работает без компаратора.
Русские слова и буква ё
Строки сравниваются по кодам символов. У ё код больше, чем у я, поэтому «ёлка» встанет после «яблоко»:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> words = new ArrayList<>(List.of("яблоко", "ёлка", "арбуз"));
Collections.sort(words);
System.out.println(words);
}
}[арбуз, яблоко, ёлка]Сортировку по правилам русского языка даёт Collator:
words.sort(Collator.getInstance(Locale.forLanguageTag("ru")));Нужны import java.text.Collator; и import java.util.Locale;. После этого «ёлка» встанет между «арбуз» и «яблоко», а слова с большой и маленькой буквы — рядом.
Подводные камни
List.of(…)не изменяется. Сортировка такого списка выброситUnsupportedOperationException. Сделайте копию:new ArrayList<>(List.of(…)).- Сортировка меняет исходный массив. Если исходный порядок нужен, отсортируйте копию:
Arrays.copyOf(a, a.length). - Числа в строках сортируются как текст:
"10"встанет раньше"9". Переведите строки в числа или сортируйте компараторомComparator.comparingInt(Integer::parseInt).