我正在尝试弄清楚使用时如何计算列表中特定值的百分比stream。
我的对象getTag可以取值G或Y我想计算G:s列表中的百分比。另一个对象是getDateTime形式1946-01-12。
我有条件,filter(weather -> !weather.getDateTime().isAfter(dateTo) && !weather.getDateTime().isBefore(dateFrom))因为我只想要用户输入的两个日期之间的百分比。
因此,每个DateTime值对应于G或Y。我曾经Collectors.counting()计算两者的频率G和Y,但我怎么能得到的百分比是多少?
Map<String, Long> percentage = weatherData.stream()
.filter(weather -> !weather.getDateTime().isAfter(dateTo) && !weather.getDateTime().isBefore(dateFrom))
.collect(Collectors.groupingBy(Weather::getTag, Collectors.counting()));
问题来源:Stack Overflow
如果将您关心的项目(“ G”)映射为1,其他所有项映射为0,则平均值为流中“ G”的百分比。
double pctG = list.stream()
.mapToInt(obj -> obj.getTag().equals("G") ? 1 : 0)
.summaryStatistics()
.getAverage();
在Java 13中,您可以使用teeing()收集器按标记对元素进行计数,并在过滤后将元素总数进行计数,最后将组计数除以总数即可:
Map<String, Double> fractions = weatherData.stream()
.filter(...)
.collect(
Collectors.teeing(
Collectors.groupingBy(Weather::getTag, Collectors.counting()),
Collectors.counting(),
YourClass::scale));
其中scale()函数将每个组由总计:
static <T> Map<T, Double> scale(Map<? extends T, Long> counts, long total) {
return counts.entrySet().stream().
.collect(Collectors.toMap(e -> e.getKey(), ((double) e.getValue()) / total));
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。