簡體   English   中英

Java 8 - 按 Map 的鍵和值對列表進行排序

[英]Java 8 - Sort a List by Map's Key and Value

最終目標是對以下場景的列表進行排序:

我有一個枚舉,其中 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()有 MAJOR - 5 和 MINOR - 10

如果我想要降序值,那么結果應該是:

  • aggregatedData.get(1) - BLOCKER - 3 和 MAJOR - 2 和 MINOR - 4
  • aggregatedData.get(0) - BLOCKER - 1 和 MAJOR - 2
  • aggregatedData.get(3) - MAJOR - 5 和 MINOR - 10
  • aggregatedData.get(2) - MAJOR - 2 和 MINOR - 8

(注意是 BLOCKER 的下一個優先級的 MAJOR 在 get(3) 中的計數高於 get(2))

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

問題是,我必須比較Severity以及與之相關的值。 我不確定在這種情況下如何構造比較器。

回答我自己的問題:

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使用了compareTo並使用了上面的compareTo方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM