【问题标题】:How can I sort a Map according to the parameters of its values? [duplicate]如何根据其值的参数对 Map 进行排序? [复制]
【发布时间】:2015-04-29 07:06:48
【问题描述】:
Stream<Map.Entry<String, List<Object>>> sorted = index.entrySet().stream()
                .sorted(Map.Entry.comparingByValue());

Stream&lt;Map.Entry&lt;String,List&lt;NFArticle&gt;&gt;&gt; 类型中的方法sorted(Comparator&lt;? super Map.Entry&lt;String,List&lt;NFArticle&gt;&gt;&gt;) 不适用于 论据(Comparator &lt;Map.Entry&lt;Object,Comparable&lt;? super Comparable&lt;? super V&gt;&gt;&gt;&gt;)

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

【问题讨论】:

  • 我从那篇文章中复制了代码,但在这种情况下我不知道如何访问 List 值的 size() 参数,因为 compareByValue 似乎只适用于原始数据类型和字符串( ?)
  • 您是否尝试按列表的大小(即条目的值)对映射条目进行排序?

标签: java java-8


【解决方案1】:

这可能对你有帮助。

我将结果映射的类型更改为 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));
}

【讨论】:

  • @AlexisC。什么意思?
  • Arrays.asList(new Integer[]{1, 2, 3})); 可以写成Arrays.asList(1, 2, 3)
  • * 可以写(亲爱的我的英语)
  • @AlexisC。我不知道这个选项。谢谢!这是我今天学到的第一件事。
【解决方案2】:

Map.Entry.comparingByValue() 仅在映射中的值为ComparableList 不是Comparable 时才有效。编译器的错误告诉你。

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

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

【讨论】:

  • ... 或 comparingByValue(comparingInt(List::size))(使用静态导入)
【解决方案3】:

Map.Entry.comparingByValue() 不能作为比较器。

这是Stream&lt;T&gt; sorted(Comparator&lt;? super T&gt; 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();
    }
});

【讨论】:

  • 如果地图的值具有可比性,Map.Entry.comparingByValue() 可以用作比较器。 List 不是这种情况,因此会出现编译错误。如果不是,您可以只为重载方法提供一个(并且它避免为条目提供比较器,因为您有兴趣仅将条目与其各自的值进行比较)......此外,您的代码可以使用 lambda 表达式简化这里
猜你喜欢
  • 2018-05-24
  • 2023-01-27
  • 1970-01-01
  • 2016-01-21
  • 2016-09-11
  • 2020-01-31
  • 2014-01-14
  • 2021-12-09
  • 2021-10-12
相关资源
最近更新 更多