У меня есть метод, для которого нужен a Comparator
для одного из его параметров. Я хотел бы передать a Comparator
который делает нормальное сравнение и обратный компаратор, который делает наоборот.
java.util.Collections
обеспечивает a reverseOrder()
это хорошо для обратного сравнения, но я не мог найти никого нормальным Comparator
.
Единственное решение, что вошло в мой ум, Collections.reverseOrder(Collections.reverseOrder())
. но мне не нравится он потому что двойной метод, звоня внутри.
Конечно, я мог записать a NormalComparator
как это:
public class NormalComparator<T extends Comparable> implements Comparator<T> {
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}
Но я действительно удивлен, что Java не имеет решения для этого из поля.
Большинство мест, где можно указать Comparator
, также имеют версию без использования Comparator
вообще, и в этом случае используется естественный порядок (т.е. ожидается, что все объекты реализуют Comparable
и используется compareTo
).
Поэтому обычное решение этой проблемы - не указывать Comparator
вообще. Есть ли у вас конкретный случай, когда поддерживается только подход Comparator
?
Если вам это абсолютно необходимо, Google Collections (а также Guava, которая является супермножеством Google Collections) предоставляет Ordering. natural()
который возвращает объект Ordering
, представляющий естественный порядок, определенный интерфейсом Comparable
. Ordering
реализует Comparator
, поэтому вы можете просто использовать его.
обычно нет необходимости в естественном порядке Comparator
, поскольку обычно есть перегрузка, которая требует Сопоставимый
. Вы всегда можете следовать примеру Collections.reverseOrder ()
и написать что-то вроде этого:
private static final Comparator<?> NATURAL_ORDER =
new Comparator<Comparable<Object>>() {
@Override public int compare(Comparable<Object> o1, Comparable<Object> o2) {
return o1.compareTo(o2);
}
};
@SuppressWarnings("unchecked")
public static <T> Comparator<T> naturalOrder() {
return (Comparator<T>) NATURAL_ORDER;
}
Затем вы можете написать что-то вроде:
List<String> names = Arrays.asList("Bob", "Alice", "Carol");
Collections.sort(names, naturalOrder());
System.out.println(names);
// prints "[Alice, Bob, Carol]"
Но я очень удивлен, что у Java нет готового решения для этой проблемы.
Я полагаю, это было бы полезно в некоторых случаях ... как ваш. Но в большинстве вариантов использования приложение просто напрямую использовало бы метод объекта compareTo
. Обращение через объект Comparator
бесполезно ... большую часть времени.
Я предполагаю, что разработчики этих Java API не сочли ваш вариант использования достаточно важным, чтобы поддерживать его напрямую. Кроме того, ваша реализация - это всего четыре строчки кода.
Библиотеки классов Java несовершенны. Научитесь с этим жить :-).
Для обратного порядка используйте Collections.reverseOrder ()
...
Возвращает компаратор, который устанавливает обратный естественный порядок для коллекция объектов, реализующих интерфейс Comparable.