2016-12-05 98 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.不知道爲什麼。 –