gpt4 book ai didi

Java 8 Stream/Collectors 映射键与 Collectors.counting()

转载 作者:行者123 更新时间:2023-12-02 04:59:28 32 4
gpt4 key购买 nike

我想获取按频率键控的数组值频率图。我能够得到相反的 - 按值键控的 map 。尝试切换参数,但 grouping by 不接受 Collector 作为第一个参数。

另一个问题,如何将 Map 实现更改为 LinkedHashMap 以保留按数组元素排序(如果 map 按值作为键)?

  int [] arr = {1, 4, 5, 9, 2, 4, 3, 1, 1, 3, 5, 3, 2, 4, 2, 9, 2, 1};

Map<Integer, Long> collect = Arrays
.stream(arr)
.boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

结果是{1=4, 2=4, 3=3, 4=3, 5=2, 9=2} 我正在寻找的是 {4=1, 3=[4, 3] , 2=[5, 9] ... } 表示 1 出现 4 次, 4 出现 3 次, 5 出现 2 次, 9.

我的目标是获取以频率为键、以值作为数组元素列表的 Map。对于键冲突,请将另一个值添加到值列表中。

最佳答案

一个可能的解决方案是首先创建映射值 -> 频率,然后将其收集到另一个映射中,您可以在其中按频率进行分组。

Map<Long, List<Integer>> collect = 
Arrays.stream(arr)
.boxed()
.collect(collectingAndThen(groupingBy(identity(), counting()),
m -> m.entrySet().stream().collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList())))));

也许一种更清晰的方法(而不是单行)是从您的 collect map 开始,并将 forEachcomputeIfAbsent 结合使用:

Map<Long, List<Integer>> result = new HashMap<>();
collect.forEach((value, freq) -> result.computeIfAbsent(freq, u -> new ArrayList<>()).add(value));

关于Java 8 Stream/Collectors 映射键与 Collectors.counting(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45639655/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com