使用Java 8 Stream API进行计数和排序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Java 8 Stream API进行计数和排序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1304字,纯文字阅读大概需要2分钟。
内容图文
我想知道如何通过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 8 Stream API进行计数和排序全部内容,希望文章能够帮你解决使用Java 8 Stream API进行计数和排序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。