Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прога 2012.docx
Скачиваний:
3
Добавлен:
17.09.2019
Размер:
1.45 Mб
Скачать

Вопрос 33. Comparable и Comparator

Интерфейс  Comparable  предназначен для определения так называемого естественного порядка (  natural ordering  ). Этот интерфейс определен в пакете java.lang. Обратившись к документации мы увидим, что данный интерфейс содержит всего один метод.

public int compareTo(Object obj)

Его удобно использовать при сортировке упорядоченных списков или массивов объектов.

Данный метод сравнивает вызываемый объект с obj. В отличие от метода equals, который возвращает true или false, compareTo возвращает:

·0, если значения равны;

·Отрицательное значение, если вызываемый объект меньше параметра;

·Положительное значение , если вызываемый объект больше параметра.

Метод может выбросить исключение ClassCastException, если типы объектов не совместимы при сравнении.

Необходимо помнить, что  аргумент метода compareTo имеет тип сравниваемого объекта класса.

Классы Byte, Short, Integer, Long, Double, Float, Character, String уже реализуют интерфейсComparable.

Итак, интерфейс Comparable дает нам возможность задавать порядок на множестве объектов одного или нескольких классов. Однако и этого не всегда хватает. Бывают случаи, когда в одной программе требуется иметь несколько различных вариантов порядка на одном и том же множестве. Например, если у нас есть список сотрудников, то нам может потребоваться порядок по фамилиям и порядок по табельным номерам. В этом случае интерфейс Comparable нас не спасает — он позволяет задать только один порядок.

В описанном случае вместо интерфейса Comparable следует использовать интерфейс Comparator.

Обратимся к документации. Интерфейс Comparator имеет два метода.

public int compare(Object o1, Object o2)

public boolean equals(Object obj)

int compare (Object obji 1 , object obj2  ) — возвращает отрицательное число, если  objl  в каком-то смысле меньше  obj2  ; нуль, если они считаются равными; положительное число, если  objl  больше  obj2  . Для читателей, знакомых с теорией множеств, скажем, что этот метод сравнения обладает свойствами тождества, антисимметричности и транзитивности;

boolean equals (Object obj) — сравнивает данный объект с объектом obj , возвращая true , если объекты совпадают в каком-либо смысле, заданном этим методом.

Для каждой коллекции можно реализовать эти два метода, задав конкретный способ сравнения элементов, и определить объект класса SortedMap вторым конструктором. Элементы коллекции будут автоматически отсортированы в заданном порядке.

Основным отличием интерфейса Comparator от Comparable является то, что вы можете создавать несколько видов независимых сортировок.

Вопрос 34. Сортировка со стандартным и нестандартным отношением порядка.

Для стандартной сортировки коллекций существует метод sort() :

Collections.sort(сюда_кидаем_коллекцию)

Для массивов:

Arrays.sort(массив)

Временами сортировка массивов простых типов в Java заставляет нас потрудиться. Не говоря о сортировке массивов объектов. Теперь же мы можем сортировать и массивы простых типов и массивы объектов, написав относительно малый код, с помощью интерфейса Comparator.

Е сли вы хотите обеспечить способность сортировки ваших собственных классов, тогда вы должны реализовать(implement) Comparator и перезагрузить методcompare(Object obj1, Object obj2 ) самостоятельно. Затем в параметрах конструктора коллекции указать объект класса, который реализует класс Comparator (стр. 445. Java 2 или 6 лаб. раб.).