Java 8-按地图的键和值对列表进行排序

时间:2020-09-25 14:53:30

标签: java sorting dictionary java-8 comparator

最终目标是对以下情况的列表进行排序:

我有一个枚举,其中BLOCKER的严重性最高,而MINOR的严重性最低。

public enum Severity {
    MINOR(0)
    MAJOR(1),
    BLOCKER(2);

我有一个SeverityProfile类

public class SeverityProfile {

    private final Map<Severity, Integer> severities;

    public SeverityProfile(Map<Severity, Integer> severities) {
        this.severities = Collections.unmodifiableMap(severities);
    }

    public Map<Severity, Integer> getSeverities() {
        return severities;
    }

主要对象AggregatedData


public class AggregatedData {

 
    private final SeverityProfile severityProfile;
    ... other private variables

    public AggregatedData(SeverityProfile severityProfile) {

        this.severityProfile = severityProfile;
  
    }


    public SeverityProfile getSeverityProfile() {
        return severityProfile;
    }
    ... other getters
}

现在,我必须按地图的严重程度对List<AggregatedData> aggregatedData进行排序。 aggregatedData.get(0).getSeverityProfile().getSeverities()具有BLOCKER-1和MAJOR-2 aggregatedData.get(1).getSeverityProfile().getSeverities()具有BLOCKER-3和MAJOR-2和MINOR-4 aggregatedData.get(2).getSeverityProfile().getSeverities()具有MAJOR-2和MINOR-8 aggregatedData.get(3).getSeverityProfile().getSeverities()的主要-5和次要-10

如果我想要降序的值,那么结果应该是:

  • aggregatedData.get(1)-阻止程序-3和主要-2和轻微-4
  • aggregatedData.get(0)-阻止程序-1和主要-2
  • aggregatedData.get(3)-主要-5和次要-10
  • aggregatedData.get(2)-主要-2和次要-8

(通知BLOCKER的下一个优先级的MAJOR在get(3)中的计数高于get(2))

我想做一个Collections.sort(aggregatedData, new Comparator<AggregatedData>() {

问题是,我必须比较Severity以及与之相关的值。 在这种情况下,我不确定如何构造比较器。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

public class SeverityProfile implements Comparable<SeverityProfile> {

    private final Map<Severity, Integer> severities;

    private final int[] counts;

    public SeverityProfile(Map<Severity, Integer> severities) {
        counts = new int[Severity.values().length];

        this.severities = Collections.unmodifiableMap(severities);

        counts[Severity.BLOCKER.ordinal()] = severities.getOrDefault(Severity.BLOCKER, 0);
        counts[Severity.MAJOR.ordinal()] = severities.getOrDefault(Severity.MAJOR, 0);
        counts[Severity.MINOR.ordinal()] = severities.getOrDefault(Severity.MINOR, 0);
    }


    public Map<Severity, Integer> getSeverities() {
        return severities;
    }

    public int[] getCounts() {
        return counts;
    }

    @Override
    public int compareTo(SeverityProfile other) {
        if (other == this) {
            return 0;
        }

        for (Severity severity : Severity.getSeveritiesByDescendingRank()) {
            if (getCounts()[severity.ordinal()] != other.getCounts()[severity.ordinal()]) {
                return getCounts()[severity.ordinal()] - other.getCounts()[severity.ordinal()];

            }
        }
        return 0;
    }
}

我在Collections.sort中使用了Comparator,并使用了以上compareTo方法。

相关问题