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

Сортировка коллекций Java()

Метод сортировки коллекций Java, Java Collections.sort(), Пример сортировки коллекций Java в естественном порядке и в обратном порядке, Сопоставимый, Сортировка с помощью компаратора

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

Сегодня мы рассмотрим метод сортировки коллекций Java. При работе с коллекциями на java нам чаще всего приходится сортировать данные.

Сортировка коллекций Java()

Класс Java Collections предоставляет нам очень удобный метод Collections.sort() для сортировки всех Списков реализаций, таких как LinkedList и ArrayList .

Существует два перегруженных Collections.sort() метода, которые:

  1. сортировка(Список списка) : Сортирует элементы списка в порядке возрастания их естественного порядка.
  2. сортировка(Список списка, компаратор c) : Сортирует элементы списка в соответствии с порядком, заданным компаратором .

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

Сортировка коллекций Java(список)

Рассмотрим ArrayList из Строки :

List fruits = new ArrayList();
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Banana");
fruits.add("Grape");

Теперь мы отсортируем его с помощью Collections.sort() :

Collections.sort(fruits);
// Print the sorted list
System.out.println(fruits);

Результатом этой программы будет:

[Apple, Banana, Grape, Orange]

Следовательно, мы видим, что Collections.sort() отсортировал список строк в лексическом порядке. И это ничего не возвращает.

Что делать, если у нас есть список пользовательских объектов? Конечно, мы тоже можем их отсортировать. Рассмотрим фрукт класса:

package com.journaldev.collections;
public class Fruit{
    private int id;
    private String name;
    private String taste;

    Fruit(int id, String name, String taste){
        this.id=id;
        this.name=name;
        this.taste=taste;
    }
}

Давайте создадим список фруктов:

List fruitList=new ArrayList();
Fruit apple=new Fruit(1, "Apple", "Sweet");
Fruit orange=new Fruit(2, "Orange", "Sour");
Fruit banana=new Fruit(4, "Banana", "Sweet");
Fruit grape=new Fruit(3, "Grape", "Sweet and Sour");

fruitList.add(apple);
fruitList.add(orange);
fruitList.add(banana);
fruitList.add(grape);

Для сортировки этого списка, если мы напрямую используем Collections.sort(список списков) , это приведет к ошибке во время компиляции, поскольку для объектов Fruit не определен естественный порядок. Таким образом, он не знает, как отсортировать этот список.

Чтобы объекты имели естественный порядок, они должны реализовать интерфейс java.lang.Сопоставимо .

Интерфейс Comparable имеет метод compareTo() , который возвращает отрицательное, 0, положительное значение, если текущее значение меньше, равно или больше значения, с которым мы сравниваем, соответственно.

Давайте улучшим класс Fruit для реализации Сопоставимого интерфейса . Мы определяем, что естественный порядок сортировки основан на поле “идентификатор” фруктов:

package com.journaldev.collections;
public class Fruit implements Comparable{
    private int id;
    private String name;
    private String taste;

    Fruit(int id, String name, String taste){
        this.id=id;
        this.name=name;
        this.taste=taste;
    }
    @Override 
    public int compareTo(Object o) {
        Fruit f = (Fruit) o; 
        return this.id - f.id ;
    }
}

Теперь , когда мы реализовали Сопоставимый , мы можем сортировать список без каких-либо ошибок:

Collections.sort(fruitList);
fruitList.forEach(fruit -> {
    System.out.println(fruit.getId() + " " + fruit.getName() + " " + 
      fruit.getTaste());
});

Результат будет таким, как показано ниже:

1 Apple Sweet
2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet

Сортировка коллекций Java(Список списков, компаратор c)

Чтобы определить пользовательскую логику сортировки, которая отличается от естественного порядка элементов, мы можем реализовать java.util.Интерфейс компаратора и передайте его экземпляр в качестве второго аргумента sort() .

Давайте рассмотрим, что мы хотим определить порядок на основе поля “имя” фрукта. Мы реализуем Компаратор , и в его методе compare() нам нужно написать логику для сравнения:

package com.journaldev.collections;

class SortByName implements Comparator {
    @Override
    public int compare(Fruit a, Fruit b) {
        return a.getName().compareTo(b.getName());
    }
}

Теперь мы можем отсортировать его с помощью этого компаратора:

Collections.sort(fruitList, new SortByName());

Результат будет таким, как показано ниже:

1 Apple Sweet
4 Banana Sweet
3 Grape Sweet and Sour
2 Orange Sour

Вместо того, чтобы писать новый класс для компаратора, используя функцию лямбда, мы также можем обеспечить логику сортировки во время выполнения:

Collections.sort(fruitList, (a, b) -> {
    return a.getName().compareTo(b.getName());
});

Коллекции Java.Обратный порядок

По умолчанию Коллекция.сортировка выполняет сортировку в порядке возрастания. Если мы хотим отсортировать элементы в обратном порядке, мы могли бы использовать следующие методы:

  1. ReverseOrder() : Возвращает Компаратор , который налагает обратный естественный порядок элементов коллекции.
  2. Обратный порядок(компаратор cmp) : Возвращает Компаратор , который устанавливает обратный порядок указанного компаратора.

Вот примеры для обоих этих методов:

Пример обратного порядка коллекций Java()

Collections.sort(fruits, Collections.reverseOrder());
System.out.println(fruits);

Он выведет фрукты в обратном алфавитном порядке:

[Orange, Grape, Banana, Apple]

Пример обратного порядка коллекций Java(компаратор cmp)

Collections.sort(fruitList, Collections.reverseOrder(new SortByName()));
fruitList.forEach(fruit -> {
    System.out.println(fruit.getId() + " " + fruit.getName() + " " + 
      fruit.getTaste());
});

Выход:

2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet
1 Apple Sweet

Это все для метода сортировки коллекций Java() и его примеров.

Ссылка: API Doc