首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将doubles分组以映射以创建直方图

将doubles分组以映射以创建直方图
EN

Stack Overflow用户
提问于 2018-08-10 02:17:39
回答 2查看 159关注 0票数 1

假设我们有样本列表(类型为Double) {1.5,1.1,2.2,1.0,2.2,3.3}。如何实现一个将Integer作为键(组)并将出现次数作为该Map的值的Map?对于给定的示例1 -> 3,2 -> 2,3 case 1。我知道我可以使用if/else if或case逻辑来实现这一点,但在我的应用程序中,它将是30个不同的组(代码中为30个case或elseifs )。应用程序正在根据从DB (数百万个样本)中提取的给定风速创建风直方图。我的方法是:

代码语言:javascript
复制
Map<Double, Long> map = windData.stream()
.collect(Collectors.groupingBy(WindData::getSpeed, Collectors.counting()));

其中windData是保存风速的列表,getSpeed是检索风速值。这种方法生成doubles组,这意味着它只计算出现的次数,我希望得到0-1,1-2,2-3,3-4等组。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-10 02:26:55

只需在groupingBy的第一个参数中将double向下舍入为int。您的问题首先说明示例的List包含Doubles,但您的代码片段表明它实际上是一个List<WindData>。到底是哪一个?

代码语言:javascript
复制
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
....

List<Double> speeds = ...;
Map<Integer, Long> histogram = speeds.stream()
               .collect(groupingBy(Double::intValue, counting()));

另外,除非您出于某种其他原因从数据库中提取此数据,否则请考虑使用SQL group by在数据库端执行此操作。

票数 1
EN

Stack Overflow用户

发布于 2018-08-10 02:45:43

这是一个从double值流中产生“直方图”数据的管道:

代码语言:javascript
复制
HashMap<Double, Long> res = 
        DoubleStream.of(1.5, 1.1, 2.2, 1.0, 2.2, 3.3)
        .collect(HashMap<Double, Long>::new,
                 (map, dbl) -> map.merge(Math.floor(dbl), 1L, (k, v) -> k + v), 
                 (map1, map2) -> map1.putAll(map2));

打印res输出{2.0=2, 1.0=3, 3.0=1}

要将其应用于您的对象流,我只需使用mapToDouble将其转换为双倍流

代码语言:javascript
复制
windData.stream().mapToDouble(WindData::getSpeed)
    .collect(HashMap<Double, Long>::new,
                 (map, dbl) -> map.merge(Math.floor(dbl), 1L, (k, v) -> k + v), 
                 (map1, map2) -> map1.putAll(map2));

关于结果的说明:映射的关键字是区间的下限(00-111-2)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51773506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档