Глиф Учебники

Как отсортировать массив или список

Справочник · Java · 1 минута чтения

Массив — Arrays.sort, список — Collections.sort (или list.sort). Оба сортируют на месте — меняют сам массив или список — и по возрастанию:

Java
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 не включается.

По убыванию

Для списка:

Java
names.sort(Collections.reverseOrder());

Для массива Arrays.sort(a, Collections.reverseOrder()) работает только с массивом объектов — Integer[], а не int[]:

Java
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). Например, слова по длине:

Java
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 — короткая запись «взять длину строки». Объекты своего класса сортируют так же — по нужному полю:

Java
students.sort(Comparator.comparing(Student::getName));
students.sort(Comparator.comparingInt(Student::getAge).reversed());

Здесь getName и getAge — геттеры класса Student. Второе правило можно добавить через thenComparing.

Если у объектов есть один естественный порядок, класс может реализовать интерфейс Comparable с методом compareTo — тогда Collections.sort(list) работает без компаратора.

Русские слова и буква ё

Строки сравниваются по кодам символов. У ё код больше, чем у я, поэтому «ёлка» встанет после «яблоко»:

Java
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:

Java
words.sort(Collator.getInstance(Locale.forLanguageTag("ru")));

Нужны import java.text.Collator; и import java.util.Locale;. После этого «ёлка» встанет между «арбуз» и «яблоко», а слова с большой и маленькой буквы — рядом.

Подводные камни