Руководство по Java Core. Коллекции. Comparator.

Такие структуры данных, как 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 и рассмотрели пример простого приложения с его использованием.