Java Comparator: Описание, Справка и Примеры
Java Comparator - это интерфейс для создания пользовательских функций сравнения. Он определяет две методы - compare() и equals().
Метод compare() - используется для сравнения двух объектов и возвращает отрицательное число, положительное число или ноль в зависимости от того, какой объект меньше, больше или равен. Его синтаксис выглядит так:
int compare(T obj1, T obj2)
где T - тип объектов, которые будут сравниваться.
Например, если мы хотим отсортировать список строк по длине, мы можем создать класс StringLengthComparator, который реализует Comparator
public class StringLengthComparator implements Comparator
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
}
В этом примере мы используем встроенный метод Integer.compare() для сравнения длин строк. Если s1.length() меньше, чем s2.length(), метод compare() возвращает отрицательное число, если они равны - ноль, а если s1.length() больше s2.length() - положительное число.
Теперь мы можем использовать нашу функцию сравнения для сортировки списка строк:
List
Collections.sort(list, new StringLengthComparator());
Мы передаем нашу функцию в метод sort() класса Collections, который автоматически вызывает метод compare() для сравнения элементов списка.
Метод equals() - используется для определения, равны ли два объекта. Он имеет следующую сигнатуру:
boolean equals(Object obj)
Для успешного сравнения двух объектов через интерфейс Comparator нужно использовать метод equals() с осторожностью. Хорошей практикой является добавление проверки на равенство ссылок в метод equals().
Вот пример, который демонстрирует создание и использование пользовательского компаратора:
public class MyClass {
private int id;
private String name;
public MyClass(int id, String name) {
this.id = id;
this.name = name;
}
// геттеры и сеттеры
public static void main(String[] args) {
List
list.add(new MyClass(1, "John"));
list.add(new MyClass(2, "Bob"));
list.add(new MyClass(3, "Alex"));
Comparator
@Override
public int compare(MyClass o1, MyClass o2) {
return Integer.compare(o1.getId(), o2.getId());
}
};
Comparator
@Override
public int compare(MyClass o1, MyClass o2) {
return o1.getName().compareTo(o2.getName());
}
};
// Сортируем список с помощью компаратора byId
Collections.sort(list, byId);
for (MyClass obj : list) {
System.out.println(obj);
}
System.out.println();
// Сортируем список с помощью компаратора byName
Collections.sort(list, byName);
for (MyClass obj : list) {
System.out.println(obj);
}
}
@Override
public String toString() {
return "MyClass [id=" + id + ", name=" + name + "]";
}
}
В этом примере класс MyClass определяет два поля - id и name. Мы создаем список объектов MyClass и определяем два компаратора для сортировки списка по id и name. Затем мы используем метод sort() класса Collections, чтобы отсортировать список по каждому из компараторов.
Класс Comparator очень полезен, когда нужно отсортировать список или массив объектов по нестандартному критерию. Он также подходит для использования в Map для определения порядка элементов в коллекции.