[英]Sort list of objects based on a parameter value in 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
在这里,我有一个用例,我想基于predicateStatus对List [PredicateInfo]进行排序。 例如:
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
接口,并且可以调用sorting调用:
Collections.sort(list);
这将隐式调用该方法compareTo
中声明Comparable
。 更多细节在这里 。
您可以将比较器传递给sort方法。
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
列表中的位置排序。 这是您提供的顺序(或优先级)。 因此,具有predicateStatus = VERIFIED
的PredicateInfo
对象将在输出中排在第一位。
接下来,对于相同的对象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())
}
});
这会给你一个排序列表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.