2016-12-05 94 views
1

我需要做一些非常简单的事情,但我无法做到这一点。我有双打称为brightnessArray我从HSB(色调,亮度,饱和度)的对象的阵列中提取这样的阵列:按Java流分组到一个范围

double[] brightnessArray = Arrays.stream(hsbSourcePixelArray) 
      .mapToDouble(b -> b.brightness).toArray(); 

现在,我需要将它们分组在256个箱。我想通过写这样的事情要做到这一点:

Map<Integer, Integer> brightnessHistogram = Arrays.stream(brightnessArray) 
      .collect(Collectors.groupingBy(b -> b/256, Collectors.counting())); 

但是,这不是在b/256部分地方说:Operator/cannot be applied to java.lang.Object, int编译。我不确定我是怎么做这个分组的。我在这里做错了什么?

+1

如果亮度值是'double',那么Arrays.stream()返回一个专门的'DoubleStream'。你应该看看Javadoc的'DoubleStream',特别是它专门的'collect'方法,它可以做你想做的事情。我没有时间写一个完整的答案,所以这只是一个暗示,让你朝着正确的方向前进。一旦你解决了问题,如果没有人写下答案,请自己写下来,我会加快解决。 –

+0

如果没有明确的类型转换,则不能将'double'转换为'Integer'。这是一条基本规则,与lambda表达式或Streams根本无关。既然你也想使用'Stream.collect(Collector)',你必须在中间使用'.mapToObj(b - >(int)b)'。此外,'counting()'收集到'Long',所以结果将是'Map '... – Holger

回答

0

好的,你引起了我的好奇心。这是实现这一点的一种方法。

Stream<Double> ds = Arrays.stream(input).boxed(); 
    Map<Integer,Long> result = ds.collect(Collectors.groupingBy(v->v.intValue()/256, Collectors.counting())); 

这使用了级联groupingBy,需要一个第二Collector

可能有一种方法可以通过DoubleStream来完成此操作,但我发现我并不像我想到的专业流那样多。稍后研究一些有趣的事情。

+0

v.intValue将所有内容放在一个桶中。另一方面,v.doubleValue/256.0表示'不存在类型变量的实例,因此Double符合整数K具有不兼容的边界:等式约束:整数下界:Double'。目前,所有的像素都只有一个“0”桶。但我希望它们在256个桶中,因此需要v.doubleValue/256.0。我们如何解决这个问题? –

+0

啊,应该是Map 。修复了静态分析警告 –

+0

有趣的是,创建的地图中元素的数量是243而不是256.不知道为什么。 –