根据Java中的参数值对对象列表进行排序

时间:2018-07-17 14:59:17

标签: java sorting

我有对象列表,并且该对象的结构定义如下:

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")]

一个简单的解决方案是一遍又一遍地迭代以获得排序后的列表,我正在尝试寻找其他替代方法来实现相同的目的。

3 个答案:

答案 0 :(得分:0)

使用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,请参见here

或者,PredicateInfo可以实现Comparable接口,您可以调用排序调用:

Collections.sort(list);

,它将隐式调用compareTo中声明的方法Comparable。更多详细信息here

答案 1 :(得分:0)

您可以将比较器传递给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列表中的位置进行排序。这是您提供的顺序(或优先级)。因此,带有PredicateInfo的{​​{1}}对象将在输出中排在首位。

接下来,对于具有相同predicateStatus = VERIFIED的对象,按照predicateStatus的自然顺序(字典顺序)进行排序

Ideone Demo

答案 2 :(得分:0)

对于列表中的值:

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())
      }
    });

这会给您一个排序列表