按分组到Java流中的一个范围

按分组到Java流中的一个范围,java,group-by,java-stream,Java,Group By,Java Stream,我需要做一些非常简单的事情,但我做不到。我有一个称为brightnessArray的双精度数组,我从HSB(色调、亮度、饱和度)对象数组中提取了它,如下所示: double[] brightnessArray = Arrays.stream(hsbSourcePixelArray) .mapToDouble(b -> b.brightness).toArray(); Map<Integer, Integer> brightnessHistogram =

我需要做一些非常简单的事情,但我做不到。我有一个称为
brightnessArray
的双精度数组,我从
HSB
(色调、亮度、饱和度)对象数组中提取了它,如下所示:

double[] brightnessArray = Arrays.stream(hsbSourcePixelArray)
            .mapToDouble(b -> b.brightness).toArray();
Map<Integer, Integer> brightnessHistogram = Arrays.stream(brightnessArray)
            .collect(Collectors.groupingBy(b -> b/256,  Collectors.counting()));
现在,我需要把它们放在256个箱子里。我正试图通过写这样的东西来做到这一点:

double[] brightnessArray = Arrays.stream(hsbSourcePixelArray)
            .mapToDouble(b -> b.brightness).toArray();
Map<Integer, Integer> brightnessHistogram = Arrays.stream(brightnessArray)
            .collect(Collectors.groupingBy(b -> b/256,  Collectors.counting()));
Map brightnessHistogram=Arrays.stream(brightnessArray)
.collect(Collectors.groupingBy(b->b/256,Collectors.counting());
但这并不是在
b/256
部分编译的,它说
Operator/不能应用于java.lang.Object,int


我不确定我是如何进行分组的。我做错了什么

好吧,你激起了我的好奇心。这里有一种方法可以做到这一点

    Stream<Double> ds = Arrays.stream(input).boxed();
    Map<Integer,Long> result = ds.collect(Collectors.groupingBy(v->v.intValue()/256, Collectors.counting()));
Stream ds=Arrays.Stream(input.boxed();
Map result=ds.collect(Collectors.groupingBy(v->v.intValue()/256,Collectors.counting());
这将使用级联的
groupingBy
,它需要第二个
收集器


也许有一种方法可以通过
DoubleStream
实现这一点,但我发现我对专业流的了解还不如我想象的那么多。有什么有趣的事以后再研究。

好吧,你激发了我的好奇心。这里有一种方法可以做到这一点

    Stream<Double> ds = Arrays.stream(input).boxed();
    Map<Integer,Long> result = ds.collect(Collectors.groupingBy(v->v.intValue()/256, Collectors.counting()));
Stream ds=Arrays.Stream(input.boxed();
Map result=ds.collect(Collectors.groupingBy(v->v.intValue()/256,Collectors.counting());
这将使用级联的
groupingBy
,它需要第二个
收集器


也许有一种方法可以通过
DoubleStream
实现这一点,但我发现我对专业流的了解还不如我想象的那么多。以后要研究的有趣内容。

如果亮度值为
double
,则
Arrays.stream()
返回专门的
DoubleStream
。您应该查看Javadoc for
DoubleStream
,尤其是它的专门的
collect
方法,该方法可以满足您的需要。我没有时间写一个完整的答案,所以这只是一个提示,让你朝着正确的方向前进。一旦你解决了它,如果没有人写答案,你自己写,我会投票表决。如果没有显式类型转换,你不能将
double
转换为
Integer
。这是一条基本规则,与lambda表达式或流完全无关。由于您还希望使用
Stream.collect(收集器)
,因此必须在两者之间使用
.mapToObj(b->(int)b)
。此外,
counting()
收集到一个
Long
,因此结果将是
Map
…如果亮度值是
double
,则
Arrays.stream()
返回一个专门的
DoubleStream
。您应该查看Javadoc for
DoubleStream
,尤其是它的专门的
collect
方法,该方法可以满足您的需要。我没有时间写一个完整的答案,所以这只是一个提示,让你朝着正确的方向前进。一旦你解决了它,如果没有人写答案,你自己写,我会投票表决。如果没有显式类型转换,你不能将
double
转换为
Integer
。这是一条基本规则,与lambda表达式或流完全无关。由于您还希望使用
Stream.collect(收集器)
,因此必须在两者之间使用
.mapToObj(b->(int)b)
。此外,
counting()
收集到一个
Long
,因此结果将是
Map
…v.intValue将所有内容放在一个bucket中。另一方面,v.doubleValue/256.0表示“不存在类型变量的实例,因此符合整数K的Double具有不兼容的边界:相等约束:整数下限:Double”。当前在将所有像素放在一个“0”存储桶中。但我希望它们位于256个存储桶中,因此需要v.doubleValue/256.0。我们怎么解决这个问题呢?啊,应该是地图。有趣地修复了静态分析警告,创建的映射中的元素数量为243,而不是256。不知道为什么。@Core\u转储:可以是任意数量的元素。您认为除以
256
将创建256个存储桶的假设是完全错误的。如果有n个不同的数字,将它们除以普通数字将产生n个不同的数字,只有精度问题可能会减少数字集。但它永远不会超过n…v.intValue把所有的东西都放在一个桶里。另一方面,v.doubleValue/256.0表示“不存在类型变量的实例,因此符合整数K的Double具有不兼容的边界:相等约束:整数下限:Double”。当前在将所有像素放在一个“0”存储桶中。但我希望它们位于256个存储桶中,因此需要v.doubleValue/256.0。我们怎么解决这个问题呢?啊,应该是地图。有趣地修复了静态分析警告,创建的映射中的元素数量为243,而不是256。不知道为什么。@Core\u转储:可以是任意数量的元素。您认为除以
256
将创建256个存储桶的假设是完全错误的。如果有n个不同的数字,将它们除以普通数字将产生n个不同的数字,只有精度问题可能会减少数字集。但它永远不会超过n…