2016-04-20 154 views
2
private static <K, V extends Comparable<? super V>> Map<K, V> 
    sortByValue(Map<K, V> map) 
    { 
     Map<K, V> result = new LinkedHashMap<>(); 
     Stream<Map.Entry<K, V>> st = map.entrySet().stream(); 

     st.sorted(Map.Entry.comparingByValue()) 
       .forEachOrdered(e -> result.put(e.getKey(), e.getValue())); 

     return result; 
    } 

這是this後的示例。有用。問題在於它按升序排列。我怎樣才能改變它降序?排序降序排列圖java8

我是這樣做的:

public static <K, V extends Comparable<? super V>> Map<K, V> 
sortByValue(Map<K, V> map) 
{ 
    List<Map.Entry<K, V>> list = 
      new LinkedList<Map.Entry<K, V>>(map.entrySet()); 
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() 
    { 
     public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) 
     { 
      return (o2.getValue()).compareTo(o1.getValue());//change o1 with o2 
     } 
    }); 

    Map<K, V> result = new LinkedHashMap<K, V>(); 
    for (Map.Entry<K, V> entry : list) 
    { 
     result.put(entry.getKey(), entry.getValue()); 
    } 
    return result; 
} 

我能做到這一點通過改變爲了我這一行:return (o2.getValue()).compareTo(o1.getValue());但我想嘗試與拉姆達EXPR。

+1

在我們回答之前,[你有什麼試過,你自己](/幫助/怎麼問)?你在哪裏尋找答案,你有什麼修飾,你是否查找過你在這段代碼中看到的API調用的文檔,等等? –

+1

順便說一句,不要使用'.forEach/.forEachOrdered'來添加條目到地圖中,而是使用collect來收集'Collectors.toMap'。 –

回答

6

您可以使用Comparator's default method reversed()來顛倒比較的意義來降序排序。

的類型推斷似乎有點過這裏,但comparingByValue()修復該問題提供明確的類型參數。

st.sorted(Map.Entry.<K, V>comparingByValue().reversed()) 
     .forEachOrdered(e -> result.put(e.getKey(), e.getValue())); 
0

可以使用已經提供的比較和乘以-1的的compareTo返回值或簡單地交換參數(佔角落的情況下)。

(a,b)-->{comparingByValue().compareTo(b,a)} 
+0

爲什麼不只是'compareTo(b,a)'? –

+0

數學上兩個東西都是等價的,性能方面你的版本更快。最後我不認爲這很重要。 – HopefullyHelpful

+0

不完全等同:比較器可能會返回'Integer.MIN_VALUE'來指示'a