И 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.

Оглавление