ObjSort

Как и было обещано в прошлом посте, речь пойдёт о сортировке массивов в Java содержащих объекты. Разбираться мы будем на небольшой задачке.

И так, вот условие. Колхозная проститутка Валентина решила удачно выйти замуж, для чего в течение некоторого времени собирала информацию обо всех особях мужского пола в деревне. Собрав данные, она решила составить список потенциальных женихов, чтобы начать обходить его по порядку, начиная с самого альфа-самца.
Наша задача — помочь ей обработать данные и составить массив пацанов.
Решается эта задача тривиально, с использованием массива объектов класса, описывающего данные о пацанах, статического метода Arrays.sort(Object o) и интерфейса Comparable<T>.
Для этого, описав бин-класс, предоставляющий информацию о пацанах с деревни, расширим его с помощью интерфейса Comparable<T>.

public class RedNeck implements Comparable<RedNeck>

После этого IDE предложит нам реализовать следующий метод (если вы пишите в блокнотике, то во время компиляции об этой необходимости скажет):

public int compareTo(RedNeck o)

Как видно из объявления метода возвращает int. При реализации этого метода вы должны следовать следующему соглашению:

  • Если пацаны по рейтингу крутости равны, то метод возвращает 0.
  • Если текущий пацан круче переданного в метод, то вернуть <0;
  • Если текущий пацан лох по сравнению с переданным в метод, то >0.

В моём примере это сделано вот так:

Ну а дальше всё просто. Теперь массив объектов с описанием пацанов можно очень просто отсортировать вот так вот:

Теперь рассмотрим ещё одну штуку, которая позволяет так же легко и просто сортировать свои собственные объекты. И имя этой штуки — интерфейс Comparator<T>.
Теперь нашими наработками для Валентины решил воспользоваться местный участковый Геннадий Васильевич, составив список пацанов по криминальной опасности. Можно это сделать, переписав метод calculateRating(), но это не путь джедая, ибо делает невозможным использование этой программы как раньше. Поэтому создадим отдельный объект, который будет содержать логику сортировки объектов, и расширим его интерфейсом Comparator<T>:


Как видно из кода, логика и принцип работы такие же, как и раньше, только в метод теперь передаются два объекта, которые потом и сравниваются.
Отсортировать массив из предыдущей задачи можно следующим образом:
Arrays.sort(redNecks, new SortedByCriminalDanger());

Подход с созданием отдельных объектов, содержащих логику сортировки, очень удобен, потому что даёт больше гибкости в сортировке по разным критериям.

Рабочий пример можно посмотреть тут (если у вас IDEA, то можно сразу импортить проект).
Подробнее про Comparable<T> и Comparator<T>, как всегда, в доках!

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс