Сортировка ArrayList объектов с помощью Compare и Comparator
В этом руководстве мы увидим, как отсортировать ArrayList, содержащий объекты, с помощью двух интерфейсов java.lang.Comparable и java.util.Comparator. Если ваша программа требует сортировки ArrayList строк или целых чисел, лучше всего ознакомиться с этими двумя статьями:- сортировка строкового или целочисленного массиваList
- сортировка ArrayList в порядке убывания
Интерфейс Compare используется, когда вы хотите отсортировать список объектов путем сравнения двух объектов с помощью предопределенного метода object1.compareTo(object2).
Отсортировать ArrayList с помощью Comparable
Для начала посмотрим результат сортировки массива объектов без реализации интерфейса Compable.
Создадим Employe.java класс:
public class Employee {
private Строковое имя;
private int age; < руб./> частная длинная заработная плата;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
public Employee(String name, int age, int salary) {
this.name = name;
this.age = возраст;
this.salary = оклад;
}
@Override
//этот метод отображает информацию о сотруднике
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
}
Мы хотим создать список ArrayList< Employee>:
Теперь вы, должно быть, поняли важность этих двух интерфейсов.
Допустим, мы хотим отсортировать список по свойству: зарплата сотрудника. Это можно сделать, реализовав интерфейс Compable, а затем java выполнит автоматическое сравнение с compareTo()объявленный Override.
import java.util.ArrayList;Вызов Collections.sort() вызывают проблему, так как это делается для объектов ArrayList, которые не работают, если вы не используете интерфейсы Compare и Comparator. Появляется ошибка компиляции:
import java.util.Collections;
public class ArrayListComparable {
public static void main(String[] args) {
ArrayList< Сотрудник> arraylist = новый ArrayList< Сотрудник> ();
arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));
System.out.println("Упорядоченный список сотрудников:\n"+Collections.sort(arraylist));
}
}
Исключение в потоке "main" java.lang.Error: Нерешенные проблемы компиляции:
Оператор + не определен для типов аргументов Строка, void
Связанное несоответствие: Универсальный метод sort(List) типа Collections неприменим к аргументам (ArrayList ). Выводимый тип Employe не является допустимой заменой ограниченного параметра >
at ArrayListComparable.main(ArrayListComparable.java:14)
Теперь вы, должно быть, поняли важность этих двух интерфейсов.
Допустим, мы хотим отсортировать список по свойству: зарплата сотрудника. Это можно сделать, реализовав интерфейс Compable, а затем java выполнит автоматическое сравнение с compareTo()объявленный Override.
После реализации интерфейса Compare в классе Employe.java результат выглядит следующим образом:
public class Employe реализует Comparable< Сотрудник> {Теперь у нас есть право вызывать метод Collections.sort():
private Строковое имя;
private int age; < руб./> частная длинная заработная плата;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
public Employee(String name, int age, int salary) {
this.name = name;
this.age = возраст;
this.salary = оклад;
}
@Override
//этот метод отображает информацию о сотруднике
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
@Override
public int compareTo(Employee emp) {
//сортировка сотрудников по возрасту по порядку croiddant
//reretroune отрицательное, нулевое или положительное целое число, если возраст
//этого сотрудника меньше, равен или больше объекта по сравнению с
return (this.age - emp.age);
}
}
import java.util.ArrayList;При запуске этого фрагмента кода мы получим следующий результат:
import java.util.Collections;
public class ArrayListComparable {
public static void main(String[] args) {
ArrayList< Сотрудник> arraylist = новый ArrayList< Сотрудник> ();
arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));
Collections.sort(arraylist);
System.out.println("упорядоченный список сотрудников по возрасту:\n");
for(Employee e:arraylist)
System.out.println(e);
}
}
упорядоченный список сотрудников по возрасту:
[name=katia, age=26, salary=10000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]
[name=mateo, age=32, salary=20000]
Отсортируйте ArrayList с помощью Comparator
Как видите, список сотрудников выше отсортирован по возрастанию. но зачем тогда использовать интерфейс Comparator? Потому что могут быть ситуации, когда сортировка основана на нескольких параметрах, в отличие от Comparable. Например, мы хотим, чтобы сортировка сотрудников была основана на имени, возрасте и зарплате.Параметр compare(Object o1, Object o2) интерфейса Comparator принимает два объекта. В нашем примере он должен быть реализован три раза (имя, возраст и зарплата), чтобы он возвращал отрицательное целое число, если первый аргумент меньше второго, и ноль, если они равны, и положительное целое число, если первый аргумент больше второго.
import java.util.Comparator;Тестовый класс main:
public class Employee {
private Строковое имя;
private int age; < руб./> частная длинная заработная плата;
public String getNom() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
public Employee(String name, int age, int salary) {
this.name = name;
this.age = возраст;
this.salary = оклад;
}
@Override
//этот метод отображает информацию о сотруднике
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
/*
* Компаратор для сортировки сотрудников по фамилии
*/
публичный статический компаратор< Сотрудник> ComparatorName = новый компаратор< Сотрудник> () {
@Override
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
};
/*
* Компаратор для сортировки сотрудников по возрасту
*/
публичный статический компаратор< Сотрудник> ComparatorAge = новый компаратор< Сотрудник> () {
@Override
public int compare(Employee e1, Employee e2) {
return (int) (e1.getAge() - e2.getAge());
}
};
/*
* Компаратор для сортировки сотрудников по зарплате
*/
публичный статический компаратор< Сотрудник> ComparatorSalary = новый компаратор< Сотрудник> () {
@Override
public int compare(Employee e1, Employee e2) {
return (int) (e1.getSalary() - e2.getSalary());
}
};
}
import java.util.ArrayList;Выполнение этого кода дает:
import java.util.Collections;
public class main{
public static void main(String[] args) {
ArrayList< Сотрудник> arraylist = новый ArrayList< Сотрудник> ();
arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));
//сортировка по имени
Collections.sort(arraylist, Employee.ComparatorName);
System.out.println("упорядоченный список сотрудников по именам:");
for(Employee e:arraylist)
System.out.println(e);
//сортировка по возрасту
Collections.sort(arraylist, Employee.ComparatorAge);
System.out.println("упорядоченный список сотрудников по возрасту:");
for(Employee e:arraylist)
System.out.println(e);
//сортировка по зарплате
Collections.sort(arraylist, Employee.ComparatorSalary);
System.out.println("упорядоченный список сотрудников по зарплате:");
for(Employee e:arraylist)
System.out.println(e);
}
}
упорядоченный список сотрудников по имени:
[name=aline, age=30, salary=40000]
[name=katia, age=26, salary=10000]
[name=mateo, age=32, salary=20000]
[name=Salim, age=28, salary=35000]
упорядоченный список сотрудников по возрасту:
[name=katia, age=26, salary=10000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]
[name=mateo, age=32, salary=20000]
упорядоченный список сотрудников по зарплате:
[name=katia, age=26, salary=10000]
[name=mateo, age=32, salary=20000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]