gpt4 book ai didi

java - 使用 Java 8 Stream API 进行计数和排序

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:34 26 4
gpt4 key购买 nike

我想知道如何先按 COUNT 然后按 ASC 排序。

Stream<String> fruits = Stream.of("apple", "orange", "ananas");

Map<String, Long> letters =
fruits.map(w -> w.split(""))
.flatMap(Arrays::stream)
.collect(groupingBy(identity(), counting()));

输出:

{p=2, a=5, r=1, s=1, e=2, g=1, l=1, n=3, o=1}`

期望的输出:

{a=5, n=3, e=2, p=2, g=1, l=1, r=1, s=1, o=1}

最佳答案

不可避免地需要分两步进行映射,因为您首先需要计数,然后才能根据计数进行排序:

Map<String, Long> letters = fruits
.flatMap(Pattern.compile("")::splitAsStream)
.collect(groupingBy(identity(), counting()))
.entrySet().stream().sorted(Map.Entry.comparingByValue(reverseOrder()))
.collect(LinkedHashMap::new, (m,e) -> m.put(e.getKey(), e.getValue()), Map::putAll);

如果您假设只有 ASCII 小写字母(或任何其他小的固定大小的字符集),您可以尝试一种可能更有效的替代方法。它将处理字符和计数作为原始值,存储在固定大小的数组中。仅为最终排序和 Map 生成生成对象:

long[] histogram=fruits.flatMapToInt(String::chars)
.filter(c -> c>='a' && c<='z')// just to be sure, remove if you prefer exceptions
.collect(()->new long[26],(a,c)->a[c-'a']++, (a,b)->Arrays.setAll(a, ix->a[ix]+b[ix]));
Map<String, Long> letters=IntStream.range(0, 26).filter(i->histogram[i]!=0)
.boxed().sorted(comparingLong(i -> -histogram[i]))
.collect(LinkedHashMap::new, (m,i)->m.put(""+(char)(i+'a'),histogram[i]), Map::putAll);

关于java - 使用 Java 8 Stream API 进行计数和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33288018/

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