簡體   English   中英

按值對Java映射進行排序(包含一組)

[英]Sort java map by value (which contains a set)

我有一張看起來像的地圖

Map<Word, Set<Word>> tupleMap = new HashMap<Word, Set<Word>>();

Word類沒有什么特別的,它包含一些字符串,例如value等。 我正在嘗試根據關聯集的元素數量對這張地圖進行排序。 因此,與大多數單詞相關聯的單詞在地圖中將是第一個/最后一個。

我確實使用以下代碼按其鍵對這張地圖進行了排序:

WordMapComparator bvc = new WordMapComparator(tupleMap);
TreeMap<Word, Set<Word>> sortedTupleMap = new TreeMap<Word, Set<Word>>(bvc);
    sortedTupleMap.putAll(tupleMap); `

比較器在哪里

class WordMapComparator implements Comparator<Word> {

    Map<Word, Set<Word>> base;

    public WordMapComparator(Map<Word, Set<Word>> tupleMap) {
        this.base = tupleMap;
    }

    public int compare(Word a, Word b) {
        return a.getValue().compareTo(b.getValue());
    }
}

現在這可以正常工作,因此可以根據words值對map進行排序。 但是,我嘗試了這個比較器:

class WordMapComparator implements Comparator<Word> {

    Map<Word, Set<Word>> base;

    public WordMapComparator(Map<Word, Set<Word>> tupleMap) {
        this.base = tupleMap;
    }

    public int compare(Word a, Word b) {
        return base.get(a).size() >= base.get(b).size() ? -1 : 1;
    }
}

並測試結果圖

    1. for(Word w : sortedTupleMap.keySet()){
    2.  System.out.print(w.getValue() + " : ");
    3.  for(Word wo : sortedTupleMap.get(w)){
    4.      System.out.print(wo.getValue() + " ");
    5.  }
    6.  System.out.println();
    7. }    

在第3行,我得到了一個null pointer exception ,基本上,生成的Set為null。

為什么會發生這種情況,而且如何解決?

太感謝了!

return base.get(a).size() >= base.get(b).size() ? -1 : 1;

這顯然是錯誤的:如果單詞數相同,則應根據比較a和b的方式返回0,而不是1或-1。 只需使用

return Integer.compare(base.get(a).size(), base.get(b).size());

但是,這會使地圖將所有具有相同數量的關聯詞的詞視為相等,因此您需要通過另一個條件來區分它們:

int result = Integer.compare(base.get(a).size(), base.get(b).size());
if (result == 0) {
    result = a.compareTo(b);
}
return result;

暫無
暫無

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

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