Почему Java Collections Framework предлагает два разных способа сортировки? - PullRequest
5 голосов
/ 23 мая 2010

Если у меня есть список элементов, которые я хотел бы отсортировать, Java предлагает два способа сделать это.

Например, допустим, у меня есть список объектов Movie, и я хочу отсортировать их по названию.

Один из способов сделать это - вызвать версию статического метода java.util.Collections.sort () с одним аргументом и списком фильмов в качестве единственного аргумента. Поэтому я бы назвал Collections.sort (myMovieList). Для того чтобы это работало, класс Movie должен быть объявлен для реализации интерфейса java.lang.Comparable, а требуемый метод compareTo () должен быть реализован внутри этого класса.

Еще один способ сортировки - вызов версии статического метода java.util.Collections.sort () с двумя аргументами со списком фильмов и объектом java.util.Comparator в качестве аргументов. Я бы назвал Collections.sort (myMovieList, titleComparator). В этом случае класс Movie не реализует интерфейс Comparable. Вместо этого, внутри основного класса, который создает и поддерживает сам список фильмов, я бы создал внутренний класс, который реализует интерфейс java.util.Comparator, и реализовал один обязательный метод compare (). Затем я бы создал экземпляр этого класса и вызвал версию sort () с двумя аргументами. Преимущество этого второго метода заключается в том, что вы можете создавать неограниченное количество этих внутренних классов-компараторов, поэтому вы можете сортировать список объектов различными способами. В приведенном выше примере, например, вы можете использовать другой Comparator для сортировки по году создания фильма.

У меня вопрос: зачем изучать оба способа сортировки в Java, когда версия Collections.sort () с двумя аргументами делает все, что делает первая версия с одним аргументом, но с дополнительным преимуществом возможности сортировки элементы списка, основанные на нескольких различных критериях? Было бы на одну вещь меньше иметь в виду при кодировании. Вам нужно знать один базовый механизм сортировки списков в Java.

Ответы [ 3 ]

14 голосов
/ 23 мая 2010

Один из них - для краткости того, что должно быть распространенным случаем ( Effective Java 2nd Edition, пункт 12: рассмотрите возможность реализации Comparable). Другой, как вы заметили, предназначен для гибкости и универсальности.

Похожие вопросы

6 голосов
/ 23 мая 2010

Зависит от того, кто контролирует порядок. Если упорядочение объекта - это деталь реализации объекта, Comparable более уместно. Если упорядочение объектов контролируется вызывающей стороной, тогда Comparator более уместно.

3 голосов
/ 23 мая 2010

Я не уверен, что нахожу это странным. У меня есть список вещей для сортировки, которые имеют естественный порядок, как числа. Я действительно ожидаю, что я должен сказать API, как сравнивать числа? Я бы не стал искать метод с двумя аргументами, интуитивно. Таким образом, существует сопоставимость.

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

И, конечно, некоторые вещи не имеют естественного порядка, например Fruit, но вы все равно можете заказать их список. Таким образом, Comparator, снова.

...