2015-04-29 86 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表达式这里 –

相关问题