如何根据其值的参数对Map进行排序?

时间:2015-04-29 07:06:49

标签: java java-8

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库实现这一目标?

3 个答案:

答案 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));
}

答案 1 :(得分:3)

只有当地图中的值为Map.Entry.comparingByValue()Comparable不是List时,

Comparable才有效。编译器的错误告诉你。

您需要提供一个自定义Comparator,它知道如何按照大小对列表进行排序,例如

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

答案 2 :(得分: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();
    }
});