Общий компаратор для сортировки коллекций Java (список, набор) - PullRequest
3 голосов
/ 02 августа 2011

Мне нужен какой-то общий компаратор, который бы принимал экземпляры List или Set в качестве аргумента и аргумента направления заказа (ASC, DESC), а затем возвращал отсортированную коллекцию. Я не могу найти в Интернете этот пример, и я в ужасной спешке. Я знаю, что не задаю вопрос соответствующим образом, так как у меня нет кода для начала, но я в ужасной спешке. Коллекции будут содержать объекты, которые реализуют сопоставимые и даты.

Любые примеры, реализации очень ценятся. Спасибо.

Ответы [ 6 ]

5 голосов
/ 19 апреля 2012

Используя GenericComparator.java , вы сможете сортировать следующие типы данных: целое число, строка, длинная, двойная, число с плавающей точкой и дата.

По возрастанию

Collections.sort(persons, new GenericComparator("name", true));

По убыванию

Collections.sort(persons, new GenericComparator("name", false));

Подробная информация здесь!

5 голосов
/ 02 августа 2011

В классе Collections есть метод reverseOrder, который возвращает компаратор для универсального типа T, который должен удовлетворить ваше требование к компаратору DESC.Если вы передаете ваш Collection методу Collections.sort(), он автоматически использует сортировку ASC.

Кроме того, «сортировка» не имеет большого значения, когда речь идет о «множествах», которые поддерживают «уникальные»."элементы неупорядоченным образом (я имею в виду, что вы можете использовать TreeSet для отсортированных наборов, но это другая история).Простой обходной путь - сделать List из Set и передать его Collections.sort.

3 голосов
/ 02 августа 2011

Это может послужить базовым начальным примером для начала с вашего требования:

// Create a list
String[] strArray = new String[] {"z", "a", "C"};
List list = Arrays.asList(strArray);

// Sort
Collections.sort(list);
// C, a, z

// Case-insensitive sort
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
// a, C, z

// Reverse-order sort
Collections.sort(list, Collections.reverseOrder());
// z, a, C

// Case-insensitive reverse-order sort
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(list);
// z, C, a
2 голосов
/ 02 августа 2011

Вы должны вызывать свой компаратор, используя следующий код.

Collection.sort(myList,new MyComparatorClass());

Затем вы должны создать свой собственный класс компаратора, который будет выполнять сортировку вашего объекта EJB по возрастанию или убыванию. В этом классеВы можете сравнить свойство, по которому вы хотите выполнить сортировку. Здесь я выполняю сортировку по имени.

public class MyComparator  implements Comparator {

    public int compare(Object o1, Object o2) {
      return o1.getName().compareTo(o2.getName());
    }

}
1 голос
/ 17 декабря 2015

Вот мой общий компилятор Java 8.Вы можете сравнить любой T по функции f (T) -> R, например, Person (T) по дате рождения (R).Так как f может быть ссылкой на метод для получателя T, его легко сравнить с любым свойством (полем) T. Он обслуживает нулевые T и нулевые R (вы решаете, идут ли нулевые значения первым или последним), а также по возрастанию /в порядке убывания.Поскольку он использует естественный порядок из R, последний также должен реализовывать Comparable.См. Пример использования в конце кода.

public class CompareUtil {

    public static enum Nulls {FIRST, LAST};
    public static enum Order {ASCENDING, DESCENDING};

    /** Return a Comparator of T on a function f(T) -> R */
    public static <T, R extends Comparable<? super R>> Comparator<T> comparatorOf(
            Function<T, R> function,
            Order order,
            Nulls nulls) {

        Comparator<R> rComparator = Comparator.naturalOrder();

        if (order == Order.DESCENDING) {
            rComparator = rComparator.reversed();
        }
        rComparator = (nulls == Nulls.FIRST)? 
                Comparator.nullsFirst(rComparator) :
                    Comparator.nullsLast(rComparator);

        Comparator<T> tComparator = 
                Comparator.comparing(
                        function, rComparator);

        tComparator = (nulls == Nulls.FIRST)? 
                Comparator.nullsFirst(tComparator) :
                    Comparator.nullsLast(tComparator);

        return tComparator;
    }

//Example: construct a comparator that compares Events on event-date
//in descending date order, putting any nulls at the end of the result set
Comparator<Event> c = comparatorOf(Event::getDate, Order.DESCENDING, Nulls.LAST);
0 голосов
/ 02 августа 2011

Определение интерфейса Comparator, например

public interface Comparator<T> {
  int compare(T o1, T o2);
  boolean equals(Object obj);
}

Запись классов, которые определены для сравнения, например, для объектов даты

public class DateOrderComparator implements Comparator

для компаратора ранга

public class RankCodeComparator implements Comparator

и так далее ...

...