Сортировка списка объектов на основе значения параметра в Java

У меня есть список объектов, и структура объекта определена ниже:

class PredicateInfo {
    String predicateName;
    String predicateStatus;
}

Здесь predicateName может быть любой допустимой строкой, а predicateStatus может быть любой строкой из следующих значений: VERIFIED, IN_PROGRESS, UNVERIFIED, NOT_INITIATED.

Priority of these strings: 
Priority 1: VERIFIED
Priority 2: IN_PROGRESS
Priority 3: UNVERIFIED
Priority 4: NOT_INITIATED

Здесь у меня есть пример использования, когда я хочу отсортировать List [PredicateInfo] на основе predicateStatus. Например:

Input list:
List[ PredicateInfo("A", "IN_PROGRESS"), PredicateInfo("A", "VERIFIED")]
Output:
List[ PredicateInfo("A", "VERIFIED"), PredicateInfo("A", "IN_PROGRESS")]

Одно из простых решений - повторять снова и снова, чтобы получить отсортированный список, я пытаюсь найти другие альтернативы для достижения того же.

Здесь stackoverflow.com/questions/2784514/…

Ramon jansen gomez 17.07.2018 17:01

Кстати, не следует ли "ВАРИФИЦИРОВАТЬ" быть "ПОДТВЕРЖДЕННЫМИ"?

tobias_k 17.07.2018 17:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
2 103
3

Ответы 3

Для этого используйте Java Comparator:

public Comparator<PredicateInfo> PredicateInfoComparator 
                      = new Comparator<PredicateInfo>() {

    public int compare(PredicateInfo info1, PredicateInfo info2) {

      //your sorting logic here
    }

};

И вызывая его, используя:

Collections.sort(list, new PredicateInfoComparator());

Как объясняется в Javadoc, логика сортировки должна возвращать отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равен или больше второго. См. здесь для полной документации Javadoc.

В качестве альтернативы PredicateInfo может реализовать интерфейс Comparable, и вы можете вызвать вызов сортировки:

Collections.sort(list);

который неявно вызовет метод compareTo, объявленный в Comparable. Подробнее здесь.

Вы можете передать компаратор методу сортировки.

List<String> predicateStatuses = new ArrayList<>();
predicateStatuses.add("VERIFIED");
predicateStatuses.add("IN_PROGRESS");
predicateStatuses.add("UNVERIFIED");
predicateStatuses.add("NOT_INITIATED");


predicateInfos.sort(Comparator.<PredicateInfo>comparingInt(predicateInfo -> predicateStatuses.indexOf(predicateInfo.getPredicateStatus()))
            .thenComparing(PredicateInfo::getPredicateName));

Логика функции компаратора:

Сначала отсортируйте по позиции строки predicateStatus в списке predicateStatuses. Это порядок (или приоритет), который вы указали. Итак, объект PredicateInfo с predicateStatus = VERIFIED будет первым в выводе.

Затем для объектов с одинаковым predicateStatus сортируем по естественному (лексикографическому) упорядочиванию predicateName

Демо Ideone

Для значений в списке:

Map<Integer, String> priorityMap = new HashMap<>();
priorityMap.put(1, "VERIFIED");
priorityMap.put(2, "IN_PROGRESS");
priorityMap.put(3, "UNVERIFIED");
priorityMap.put(4, "NOT_INITIATED");

Collections.sort(inputList, new Comparator<PredicateInfo >() {
      @Override
      public int compare(PredicateInfo obj1, PredicateInfo obj2) {
        return priorityMap.get(obj1.getPredicateStatus()) - priorityMap.get(obj2.getPredicateStatus())
      }
    });

Это даст вам отсортированный список

Список приоритетов должен быть таким: Map <String, Integer> priorityMap = new HashMap <> (); priorityMap.put ("ПОДТВЕРЖДЕНО", 1); priorityMap.put ("IN_PROGRESS", 2); priorityMap.put («НЕ ПОДТВЕРЖДЕНО», 3); priorityMap.put ("НЕ ИНИЦИАТИВ", 4); Поскольку HashMap.get () вернет значение, а в compare () вы используете значение из карты в качестве приоритета для сравнения каждого из них и по «статусу предиката», который имел объект.

Cuong Vo 10.01.2021 19:15

Другие вопросы по теме