Другие уже упоминали об этом, но я повторюсь: если вы хотите написать какой-то общий метод сортировки, вы бы хотели либо предоставить Comparator
, либо чтобы элементы реализовали Comparable
.
сОбобщения, ваши методы могут выглядеть следующим образом:
public <T extends Comparable<T>> void sort(T[] array) { ... }
public <T> void sort(T[] array, Comparator<T> comparator) { ... }
Оба варианта требуют, чтобы пользователь предоставил некоторый код, который определяет, как <
, ==
и >
определены для рассматриваемых объектов (методыComparable.compareTo(right)
или Comparator.compare(left, right)
возвращает отрицательное (обычно -1) int, 0 или положительное целое (обычно 1) для указания <
, ==
или >
).
В общем,вы можете использовать Comparable
, если вы можете определить естественный (по умолчанию) порядок, например, если вы будете работать с массивом людей, они обычно могут быть упорядочены по имени.
Comparator
, с другой стороны, более гибок и обычно используется, если вы не можете или не хотите использовать порядок по умолчанию.В этом случае вы предоставляете компаратор для каждого случая, например, когда вы хотите отсортировать автомобили по цене или скорости, вы предоставляете компаратор, который внутренне сравнивает цены или скорость.
Обратите внимание, что этоне работает для таких примитивов, как int
и т. д. Таким образом, вам придется либо преобразовать их в их классы-обертки, например, Integer
, либо предоставить пользовательские методы, использующие «обычные» операторы.