Как сортировать по разным полям?

В Java есть несколько способов сортировки элементов по разным полям.

1. Использование интерфейса Comparator:
В Java есть встроенный интерфейс Comparator, который позволяет определить специальное правило сортировки для объектов. С помощью этого интерфейса можно реализовать сортировку по любому полю объекта. Для этого нужно создать класс, который реализует интерфейс Comparator, и определить метод compare(), в котором будет реализовано правило сортировки. Затем можно использовать метод Collections.sort() или Arrays.sort() для сортировки списка или массива объектов с учетом указанного правила.

Пример:

   import java.util.Comparator;
   import java.util.Arrays;

   public class Main {

       public static class Person {
           private String name;
           private int age;

           public Person(String name, int age) {
               this.name = name;
               this.age = age;
           }

           // геттеры и сеттеры

           @Override
           public String toString() {
               return "Person{" +
                       "name='" + name + ''' +
                       ", age=" + age +
                       '}';
           }
       }

       public static class PersonComparator implements Comparator<Person> {
           @Override
           public int compare(Person p1, Person p2) {
               // сравниваем по возрасту, если возраст одинаковый, то по имени
               if (p1.age != p2.age) {
                   return Integer.compare(p1.age, p2.age);
               } else {
                   return p1.name.compareTo(p2.name);
               }
           }
       }

       public static void main(String[] args) {
           Person[] people = {
                   new Person("John", 27),
                   new Person("Alice", 25),
                   new Person("Bob", 27)
           };

           Arrays.sort(people, new PersonComparator());

           for (Person person : people) {
               System.out.println(person);
           }
       }
   }

В данном примере мы создали класс Person, в котором есть два поля - name и age. Затем мы создали вложенный класс PersonComparator, который реализует интерфейс Comparator<Person>. В методе compare() мы определили правило сортировки - по возрасту, если возраст одинаковый, то по имени. Затем мы создали массив объектов Person и отсортировали его с использованием метода Arrays.sort() и передали вторым параметром экземпляр PersonComparator. После сортировки мы вывели отсортированный массив на экран.

2. Использование интерфейса Comparable:
В Java также есть интерфейс Comparable, который позволяет объектам определить свою собственную естественную сортировку. Если объект реализует интерфейс Comparable, мы можем использовать методы Collections.sort() или Arrays.sort() для сортировки списка или массива этих объектов.

Пример:

   import java.util.ArrayList;
   import java.util.Collections;
   import java.util.List;

   public class Main {

       public static class Person implements Comparable<Person> {
           private String name;
           private int age;

           public Person(String name, int age) {
               this.name = name;
               this.age = age;
           }

           // геттеры и сеттеры

           @Override
           public String toString() {
               return "Person{" +
                       "name='" + name + ''' +
                       ", age=" + age +
                       '}';
           }

           @Override
           public int compareTo(Person other) {
               // сравниваем по возрасту
               return Integer.compare(this.age, other.age);
           }
       }

       public static void main(String[] args) {
           List<Person> people = new ArrayList<>();
           people.add(new Person("John", 27));
           people.add(new Person("Alice", 25));
           people.add(new Person("Bob", 27));

           Collections.sort(people);

           for (Person person : people) {
               System.out.println(person);
           }
       }
   }

В данном примере мы в классе Person реализовали интерфейс Comparable<Person>. В методе compareTo() мы определили правило сортировки - по возрасту. Затем мы создали список объектов Person и отсортировали его с использованием метода Collections.sort(). После сортировки мы вывели отсортированный список на экран.

Оба этих способа могут быть использованы для сортировки объектов по разным полям. В классе Comparator или Comparable вы можете добавить сколько угодно правил сортировки для разных полей и их комбинаций.