У меня есть список объектов, и структура объекта определена ниже:
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")]
Одно из простых решений - повторять снова и снова, чтобы получить отсортированный список, я пытаюсь найти другие альтернативы для достижения того же.
Кстати, не следует ли "ВАРИФИЦИРОВАТЬ" быть "ПОДТВЕРЖДЕННЫМИ"?




Для этого используйте 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
Для значений в списке:
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 () вы используете значение из карты в качестве приоритета для сравнения каждого из них и по «статусу предиката», который имел объект.
Здесь stackoverflow.com/questions/2784514/…