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