2016-12-05 1 views
1

Ich muss etwas sehr einfaches tun, aber ich bin nicht in der Lage, es zu tun. Ich habe ein Array von Doppel genannt brightnessArray, die ich von einer Reihe von HSB (Farbton, Helligkeit, Sättigung) Objekt wie folgt extrahiert haben:Gruppierung nach in einem Bereich in Java-Streams

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

Nun muß ich gruppiert sie in 256 Behältern. Ich versuche, dies zu tun, indem sie so etwas wie dieses schreiben:

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

Aber dies ist nicht der b/256 Teil kompilieren, wo es heißt Operator/cannot be applied to java.lang.Object, int.

Ich bin mir nicht sicher, wie ich diese Gruppierung mache. Was mache ich hier falsch?

+1

Wenn Helligkeitswerte "double" sind, gibt 'Arrays.stream()' einen speziellen 'DoubleStream' zurück. Sie sollten sich das Javadoc für 'DoubleStream' anschauen und vor allem seine spezialisierte Methode' collect', die genau das macht, was Sie wollen. Ich habe keine Zeit, eine vollständige Antwort zu schreiben, also ist dies nur ein Hinweis, um dich in die richtige Richtung zu bringen. Sobald Sie es gelöst haben, wenn niemand eine Antwort geschrieben hat, schreiben Sie es selbst und ich werde es aufwerten. –

+0

Ohne eine explizite Typumwandlung können Sie 'double' in' Integer' nicht umwandeln. Das ist eine Grundregel, die sich nicht auf Lambda-Ausdrücke oder Streams bezieht. Da Sie auch 'Stream.collect (Collector)' verwenden wollen, müssen Sie '.mapToObj (b -> (int) b)' dazwischen verwenden. Außerdem wird 'counting()' zu 'Long' gesammelt, also wäre das Ergebnis' Map '... – Holger

Antwort

0

OK, Sie haben meine Neugier geweckt. Hier ist eine Möglichkeit, dies zu erreichen.

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

Dies verwendet die Kaskadierung groupingBy dass eine zweite Collector dauert.

Es gibt wahrscheinlich einen Weg, dies mit der DoubleStream zu erreichen, aber ich entdeckte, dass ich nicht so viel weiß, wie ich über die spezialisierten Ströme noch dachte. Etwas Interessantes später zu studieren.

+0

v.intValue setzt alles in einen Bucket. Auf der anderen Seite sagt v.doubleValue/256.0, dass keine Instanz von Typvariablen existiert, so dass Double konform zu Integer K inkompatible Grenzen hat: Gleichheitsbedingungen: Integer untere Grenzen: Double '. Derzeit werden alle Pixel auf nur einen "0" -Einschub gesetzt. Aber ich möchte, dass sie in 256 Buckets sind, daher würde v.doubleValue/256.0 benötigt. Wie lösen wir das? –

+0

Ah, sollte es Karte sein . Das hat die statische Analyse Warnung –

+0

behoben Interessanterweise ist die Anzahl der Elemente in der Karte erstellt 243 im Vergleich zu 256. Nicht sicher warum. –

Verwandte Themen