提问者:小点点

将双重对象分组以映射以创建直方图


让我们假设,我们有样本列表(类型Double){1.5,1.1,2.2,1.0,2.2,3.3}。如何实现将整数作为键(组)并将出现次数作为该贴图值的贴图?对于给定的示例1-

Map<Double, Long> map = windData.stream()
.collect(Collectors.groupingBy(WindData::getSpeed, Collectors.counting()));

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


共2个答案

匿名用户

只需将第一个参数中的双精度整数四舍五入为分组依据。首先,您的问题是样本的列表包含s,但您的代码片段表明它实际上是一个列表

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在数据库端执行此操作

匿名用户

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

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));

打印<代码>分辨率输出<代码>{2.0=2,1.0=3,3.0=1}。

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

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));

关于结果的注释:地图的键是区间的下边界(0is0-11is1-2