Comparator
И TreeSet, и TreeMap хранят элементы в отсортированном порядке. Однако именно компаратор в Java точно определяет, что такое отсортированный порядок.
Методы
Интерфейс Comparator в Java определяет два метода: compare() и equals(). Метод compare(), показанный здесь, сравнивает два элемента:
Метод Compare
int compare(Object obj1, Object obj2)
obj1 и obj2 - объекты, которые нужно сравнить. Этот метод возвращает ноль, если объекты равны. Он возвращает положительное значение, если obj1 больше, чем obj2. В противном случае возвращается отрицательное значение. При переопределении compare() вы можете изменить способ упорядочивания объектов. Например, для сортировки в обратном порядке вы можете создать компаратор, который изменит исход сравнения.
Метод Equals
Метод equals(), показанный здесь, проверяет, равен ли объект вызывающему компаратору.
boolean equals(Object obj)
obj - объект, подлежащий проверке на равенство. Метод возвращает true, если obj и вызывающий объект являются объектами Comparator и используют один и тот же порядок. В противном случае возвращается false.
Переопределять equals () не нужно, и большинство простых компараторов этого не сделают.
Пример
import java.util.*;
class Dog implements Comparator, Comparable {
private String name;
private int age;
Dog() {
}
Dog(String n, int a) {
name = n;
age = a;
}
public String getDogName() {
return name;
}
public int getDogAge() {
return age;
}
// Переопределяем метод compareTo
public int compareTo(Dog d) {
return (this.name).compareTo(d.name);
}
// Переопределяем метод compare для сортировки возраста
public int compare(Dog d, Dog d1) {
return d.age - d1.age;
}
}
public class Example {
public static void main(String args[]) {
// Берём список элементов Dog
List list = new ArrayList();
list.add(new Dog("Шегги", 3));
list.add(new Dog("Лэси", 2));
list.add(new Dog("Роджер", 10));
list.add(new Dog("Томми", 4));
list.add(new Dog("Тамми", 1));
Collections.sort(list); // Сортируем список массивов
for(Dog a: list) // Выводим сортированный список имён
System.out.print(a.getDogName() + ", ");
// Сортируем список массивов, используя компаратор
Collections.sort(list, new Dog());
System.out.println(" ");
for(Dog a: list) // Выводим сортированный список возрастов
System.out.print(a.getDogName() +" : "+ a.getDogAge() + ", ");
}
}
Получим следующий результат:
Лэси, Роджер, Шэгги, Тамми, Томми,
Тамми : 1, Лэси : 2, Лэси : 3, Томми : 4, Роджер : 10,
Примечание: сортировка класса Arrays аналогична классу Collections.