Введение

Как мы знаем, Java — это объектно-ориентированный язык программирования, и он имеет примитивные (int, char, long) и непримитивные (String, Integer, custom Objects) типы данных. Поэтому всякий раз, когда мы работаем с типами данных, сортировка объектов всегда Важное требование. Как и в большинстве случаев, нам нужно сортировать элементы, поэтому мы думаем, как сортировать, какой метод использовать. Поэтому в этом посте я собираюсь объяснить различные способы сортировки объектов в Java.

По сути, в Java есть два класса, у которых есть метод сортировки.
1. Массивы
2. Коллекции

Метод класса массивы используется для сортировки элементов примитивных типов, и при этом стабильность(порядок присоединения к массиву) не требуется. Внутри используется двойная сводная быстрая сортировка. Он не сортирует массивы в порядке, отличном от естественного.

 public static void sortPrimitiveArray() {

        int[] arr = {10,8,7, 12, 5};
        //sort
        Arrays.sort(arr);
        //print
        System.out.println(Arrays.toString(arr));
  }

Метод сортировки класса collections используется классами, которые реализуют интерфейс List, такими как ArrayList, LinkedList и Vector. Он внутренне использует сортировку слиянием , и здесь требуется стабильность.

Таким образом, тогда может возникнуть одно сомнение. Если у нас есть набор, такой как HashSet или LinkedHashSet, то как их сортировать?
Ответ на вышеизложенное: сначала преобразуйте свой набор в список, а затем отсортируйте, потому что мы этого не делаем. есть метод сортировки для Set.

Помимо естественного порядка, мы можем сортировать и в обратном порядке.

Способы сортировки коллекций

sort(List‹T› list) = берет список и сортирует его в естественном порядке.
sort(List‹T› list, Comparator c) = элемент сортируется в соответствии с предоставленным компаратором.

Like List‹String› можно сортировать без использования Comparable или Comparator

Если мы используем List‹Employee›, нам нужен Comparable или Comparator, потому что для пользовательских объектов не существует естественного порядка.

List<String> empName = new ArrayList<>();
empName.add("Mohan");
empName.add("Bob");
empName.add("jack");

Collections.sort(empName);

System.out.println(empName);
[Bob, Mohan, jack]

Сортировка с помощью Comparable

Если мы создадим класс Employee следующим образом:

public class Employee {

    private int id;
    private String name;
    private int age;

    public Employee(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    
    public static void main(String[] args) {
        List<Employee> emps = new ArrayList<>();

        emps.add(new Employee(1, "mohan", 22));
        emps.add(new Employee(2, "bob", 24));
        emps.add(new Employee(3, "Test", 34));

        //we will be getting compile time error in this line becasue Employee is a custome
//Object and it needs to use Comparable or Comparator.
//So if we add Comparable this error will be removed.
        Collections.sort(emps);

    }
}

Итак, если мы изменим первую строку, как показано ниже, и реализуем метод compareTo, тогда произойдет ошибка времени компиляции, но если мы не предоставим никакой логики внутри метода compareTo, он не будет сортировать список.

public class Employee implements Comparable<Object>{

    @Override
    public int compareTo(Object o) {
        Employee e = (Employee) o;
        //for reverse order based on id
        //return e.getId() - this.getId();

        //for natural order based on id
        //return this.getId() - e.getId();

        //sort string properties in reverse order lexographically
        return e.getName().compareTo(this.getName());
    }

Collections.reverseOrder() =Этот метод сам возвращает компаратор, который мы можем передать в методе сортировки для обратного естественного порядка.

Collections.sort(al, Collections.reverseOrder());

Существуют некоторые ограничения на использование сравнимого, например, может быть сравнение только одного поля (мы можем использовать библиотеки, или будет сложно создать несколько полей), и он также изменяет один и тот же класс, поэтому, чтобы сделать его более чистым и лучшим, мы должны использовать Компараторы.

Сортировка с компаратором

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

Компаратор присутствует в пакете java.util.

Один из способов использования компаратора:

        Collections.sort(emps, new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                return o1.getId() - o2.getId();
            }
        });

        emps.forEach(e -> System.out.println(e.getId()));

Мы можем сделать этот код кратким, используя лямбда:

Collections.sort(emps, (o1, o2) -> o1.getId() - o2.getId());

//more short
Collections.sort(emps, Comparator.naturalOrder());

Сортировка с использованием нескольких компараторов. В Java 8 есть метод создания цепочки компараторов, и мы можем использовать его, как показано ниже:

    Collections.sort(emps, new NameComparator().thenComparing(new AgeComparator()));
        
    emps.forEach(e -> System.out.println(e.getName()+ " "+e.getAge()));

Кроме того, если мы хотим сортировать объекты по нескольким полям, мы можем использовать общую библиотеку Guava или Apache для лучшей группировки.

Сортировка карты:

Для сортировки карты в Java по ключу или значению мы должны использовать TreeMap, который выполняет сортировку в естественном порядке, просто преобразуя hashMap в древовидную карту.

Кроме того, мы можем передать пользовательский компаратор при создании карты дерева, который может выполнять сортировку по ключам.

Если мы отсортируем карту по значениям, мы можем использовать как связанный список, так и древовидную карту.

Если есть какие-либо предложения, пожалуйста, дайте мне знать в комментариях ниже.

Для дальнейших реализаций и других подобных сообщений, пожалуйста, подпишитесь и хлопайте!!

Спасибо за прочтение!!

Свяжитесь со мной в LinkedIn