Такие структуры данных, как TreeMap и TreeSet хранят элементы упорядоченными. Параметр и тип сортировки определяется сущностью под названием Comparator.
Интерфейс Comparator содержит 2 ключевых метода:
- int compare(T o1, T o2)
Этот метод принимает в качестве параметров 2 объекта одинакового типа. Возвращает 0, если объекты равны. Возвращает положительное значение, если о1 больше о2 и отрицательное значение, если о2 больше о1. - boolean equals(Object obj)
Этот метод проверяет одинаковы ли объекты, который вызывает этот метод и объект, который передаётся в качестве параметра. Если объекты одинаковы – возвращает true, а если нет – false.
Для понимания того, как это работает на практике, рассмотрим пример простого приложения.
Пример:
Класс Developer
import java.util.Comparator;
public class Developer implements Comparator, Comparable {
private String name;
private int salary;
public Developer() {
}
public Developer(String name, int salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
/**
* Methods for comparing
*/
@Override
public int compareTo(Developer developer) {
return this.name.compareTo(developer.name);
}
@Override
public int compare(Developer developer1, Developer developer2) {
return developer1.salary - developer2.salary;
}
@Override
public String toString() {
return "Developer Info:" +
"\nName: " + name +
"\nSalary: $" + salary + "\n";
}
}
Класс DeveloperRunner
В результате работы программы мы получим следующий результат:
/*Some System Messages*/
Using standard sorting...
Developer Info:
Name: AsyaSmile
Salary: $2000
Developer Info:
Name: Ivan
Salary: $1500
Developer Info:
Name: Konstantin
Salary: $1000
Developer Info:
Name: Peter
Salary: $3000
Developer Info:
Name: Proselyte
Salary: $2500
========================
Using custom comparator...
Developer Info:
Name: AsyaSmile
Salary: $2000
Developer Info:
Name: Ivan
Salary: $1500
Developer Info:
Name: Konstantin
Salary: $1000
Developer Info:
Name: Peter
Salary: $3000
Developer Info:
Name: Proselyte
Salary: $2500
В это разделе мы изучили основы интерфейса Comaprator и рассмотрели пример простого приложения с его использованием.