开发者社区> 问答> 正文

使用流计算值的百分比

我正在尝试弄清楚使用时如何计算列表中特定值的百分比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

展开
收起
montos 2020-03-26 20:55:59 499 0
1 条回答
写回答
取消 提交回答
  • 如果将您关心的项目(“ 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

    2020-03-26 20:57:44
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
MaxCompute计算长尾问题优化 立即下载
新量⼦⾰命与量⼦计算 立即下载
Flink中的两类新型状态存储 立即下载