有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据映射值的参数对映射进行排序?

Stream<Map.Entry<String, List<Object>>> sorted = index.entrySet().stream()
                .sorted(Map.Entry.comparingByValue());

The method sorted(Comparator<? super Map.Entry<String,List<NFArticle>>>) in the type Stream<Map.Entry<String,List<NFArticle>>> is not applicable for the arguments (Comparator <Map.Entry<Object,Comparable<? super Comparable<? super V>>>>)

我想根据作为HashMap值的size()列表对Hashmap进行排序。如何使用Java8中的流库实现这一点


共 (3) 个答案

  1. # 1 楼答案

    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();
        }
    });
    
  2. # 2 楼答案

    这可能对你有帮助

    我将结果映射的类型更改为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));
    }
    
  3. # 3 楼答案

    Map.Entry.comparingByValue()仅当映射中的值是Comparable,而List不是Comparable时才起作用。编译器的错误告诉您这一点

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

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