2015-04-29 94 views
2
Stream<Map.Entry<String, List<Object>>> sorted = index.entrySet().stream() 
       .sorted(Map.Entry.comparingByValue()); 

方法sorted(Comparator<? super Map.Entry<String,List<NFArticle>>>)在類型Stream<Map.Entry<String,List<NFArticle>>>是不適用於 參數(Comparator <Map.Entry<Object,Comparable<? super Comparable<? super V>>>>)如何根據其參數值對圖進行排序?

我想根據解釋作爲HashMap的值的size()排序一個Hashmap。我如何使用Java 8的Stream庫實現這個目標?

+0

我複製從該職位的代碼,但我不知道如何訪問列表值的大小()參數在這種情況下,由於comparingByValue似乎僅處理基本數據類型和字符串(?) – Pete

+0

您是否嘗試按列表大小(它是條目的值)對映射條目進行排序? –

回答

5

這對您有用。

我將結果地圖的類型更改爲LinkedHashMap以尊重插入順序。

public static void main(String[] args) { 
    final Map<String, List<Integer>> map = new HashMap<>(); 
    map.put("k1", Arrays.asList(new Integer[]{1, 2, 3, 4, 5})); 
    map.put("k2", Arrays.asList(new Integer[]{1, 2, 3, 4, 5, 6})); 
    map.put("k3", Arrays.asList(new Integer[]{1, 2, 3})); 
    System.out.println(getMapSortedByListSize(map)); 
} 

public static <K, V> Map<K, List<V>> getMapSortedByListSize(final Map<K, List<V>> map) { 
    return map.entrySet().stream() 
      .sorted((e1, e2) -> e1.getValue().size() - e2.getValue().size()) 
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new)); 
} 
+0

@AlexisC。你什麼意思? –

+1

'Arrays.asList(new Integer [] {1,2,3}));'可以寫成Arrays.asList(1,2,3)' –

+1

*可以寫成(親愛的我的英語) –

3

Map.Entry.comparingByValue()只有在地圖中的值爲ComparableList不是Comparable時纔有效。編譯器的錯誤告訴你。

您需要提供一個自定義Comparator,它知道如何按照其大小對列表進行排序,例如,

Map.Entry.comparingByValue((list1, list2) -> list1.size() - list2.size()) 
+5

...或「comparisonByValue(comparisonInt(List :: size))」(帶有靜態導入) –

0

Map.Entry.comparingByValue()不能作爲比較器。

這是Stream<T> sorted(Comparator<? super T> comparator)比較:

Stream<Entry<String, List<Object>>> sortedStream = index.entrySet().stream() 
     .sorted(new Comparator<Map.Entry<String,List<Object>>>() { 
    @Override 
    public int compare(Entry<String, List<Object>> o1, Entry<String, List<Object>> o2) { 
     return o1.getValue().size()-o2.getValue().size(); 
    } 
}); 
+1

Map.Entry.comparingByValue()'可以作爲比較器,如果地圖的值是可比較的。 List並非如此,因此編譯錯誤。如果不是的話,你可以給重載的方法提供一個方法(並且避免爲條目提供一個比較器,因爲你有興趣將條目與它們各自的值進行比較)。此外,你的代碼可以用lambda表達式這裏 –

相關問題