[英]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.