Прямой компаратор в Java из поля

У меня есть метод, для которого нужен 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 не имеет решения для этого из поля.

5
задан Kevin Bourrillion 17 June 2010 в 22:01
поделиться

4 ответа

Большинство мест, где можно указать Comparator, также имеют версию без использования Comparator вообще, и в этом случае используется естественный порядок (т.е. ожидается, что все объекты реализуют Comparable и используется compareTo).

Поэтому обычное решение этой проблемы - не указывать Comparator вообще. Есть ли у вас конкретный случай, когда поддерживается только подход Comparator?

Если вам это абсолютно необходимо, Google Collections (а также Guava, которая является супермножеством Google Collections) предоставляет Ordering. natural() который возвращает объект Ordering, представляющий естественный порядок, определенный интерфейсом Comparable. Ordering реализует Comparator, поэтому вы можете просто использовать его.

6
ответ дан 14 December 2019 в 08:43
поделиться

обычно нет необходимости в естественном порядке 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]"
0
ответ дан 14 December 2019 в 08:43
поделиться

Но я очень удивлен, что у Java нет готового решения для этой проблемы.

Я полагаю, это было бы полезно в некоторых случаях ... как ваш. Но в большинстве вариантов использования приложение просто напрямую использовало бы метод объекта compareTo . Обращение через объект Comparator бесполезно ... большую часть времени.

Я предполагаю, что разработчики этих Java API не сочли ваш вариант использования достаточно важным, чтобы поддерживать его напрямую. Кроме того, ваша реализация - это всего четыре строчки кода.

Библиотеки классов Java несовершенны. Научитесь с этим жить :-).

1
ответ дан 14 December 2019 в 08:43
поделиться

Для обратного порядка используйте Collections.reverseOrder () ...

Возвращает компаратор, который устанавливает обратный естественный порядок для коллекция объектов, реализующих интерфейс Comparable.

0
ответ дан 14 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

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