Collector Generics Problem (incl. Stream & Lambda)

Hans_G

Mitglied
Es geht darum, alle Elemente einer java.util.Map als javafx.scene.chart.XYChart.Series einem javafx.scene.chart.XYChart hinzuzufügen.

Ausgangslage:
Java:
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.StackedBarChart;
import javafx.scene.chart.XYChart;

// [...]

// Chart erstellen
NumberAxis xAxis = new NumberAxis();
CategoryAxis yAxis = new CategoryAxis();
StackedBarChart<Number,String> sbc = new StackedBarChart<>(xAxis, yAxis);

// Map mit Testdaten
Map<String,Integer> dataMap = new HashMap<>();
dataMap.put("a", 23);
dataMap.put("b", 12);

So funktioniert es:
Java:
XYChart.Series<Number,String> series1 = new XYChart.Series<>();
dataMap.entrySet().stream()
        .map(e-> new XYChart.Data<Number,String>(e.getValue(), e.getKey()))
//        .sorted(comp)
        .forEach(e -> series1.getData().add(e));
sbc.getData().add(series1);

Die Elemente der Map müssen allerdings in einer bestimmten Reihenfolge hinzugefügt werden. Dafür habe ich folgenden Comparator geschrieben:
Java:
Comparator<XYChart.Data<Integer,String>> comp =
        Comparator.comparing(XYChart.Data<Integer,String>::getXValue)
        .thenComparing((a,b) -> b.getYValue().compareTo(a.getYValue()));

Wenn man jetzt allerdings .sorted(comp) wieder in die Stream-Operation einfügt, kann der Code nicht kompiliert werden, denn es wird ja XYChart.Data<Number,String> erwartet und nicht XYChart.Data<Integer,String>.

Umgekehrt ist es allerdings auch nicht möglich, bei der Definition des Comparators den Typ XYChart.Data<Number,String> zu verwenden. Der Compiler beschwert sich dann mit:
Code:
The type XYChart.Data<Number,String> does not define getXValue(T) that is applicable here

Hat jemand eine Lösung?
 

JCODA

Top Contributor
Witzigerweise klappt es so:

Java:
dataMap.entrySet().stream()
                .map(e-> new XYChart.Data<Number,String>(e.getValue(), e.getKey()))
                .sorted((a,b) -> b.getYValue().compareTo(a.getYValue()))
                .forEach(e -> series1.getData().add(e));
        sbc.getData().add(series1);

Wenn man den Comparator also innerhalb definiert. Ich such mal weiter.

Edit: Nachdem ich das Problem verstanden habe, entschuldige ich mich für meinen Beitrag.
 
Zuletzt bearbeitet:

Hans_G

Mitglied
Hallo JCODA, das hat mir schon auf die Sprünge geholfen!

Das hier geht nämlich:
Java:
Comparator<XYChart.Data<Number,String>> comp =
        Comparator.comparing((a,b) -> a.getXValue() - b.getXValue())
        .thenComparing((a,b) -> b.getYValue().compareTo(a.getYValue()));

Das Problem ist also offensichtlich, dass die Methodenreferenz XYChart.Data<Number,String>::getXValue nicht verwendet werden kann und XYChart.Data<Integer,String>::getXValue nicht für den Typ XYChart.Data<Number,String> existiert.

Für die genauen Gründe müsste man eventuell mal in der Java Language Specification eintauchen, aber das praktische Problem ist schon mal gelöst.

Geht doch nicht so.
 
Zuletzt bearbeitet:

JCODA

Top Contributor
Ich habe "rausgefunden" dass Number kein Comparable implementiert. Das ist der Grund, warum es nicht funktioniert.
Wie wäre es, wenn Du die Elemente sortierst bevor die Information "Integer" verloren geht. Also direkt nach dem Streamen. Etwa:
Java:
Comparator<Map.Entry<String,Integer >> comp =
                Comparator.comparing(Map.Entry<String,Integer>::getValue).
                thenComparing(Map.Entry<String,Integer>::getKey);
       
        XYChart.Series<Number,String> series1 = new XYChart.Series<>();
       
        dataMap.entrySet().stream()               
                .sorted(comp)
                .map(e-> new XYChart.Data<Number,String>(e.getValue(), e.getKey()))
                .forEach(e -> series1.getData().add(e));
        sbc.getData().add(series1);
 

Hans_G

Mitglied
die Elemente sortierst bevor die Information "Integer" verloren geht
Ja, auf die Reihenfolge kommt es an!

Ich muss meinen Beitrag oben (#3) übrigens wieder zurücknehmen. Eclipse hat mir zunächst vorgegaukelt, es ließe sich derartig kompilieren. Gehen täte es so:
Java:
dataMap.entrySet().stream()
        .map(e-> new XYChart.Data<Number,String>(e.getValue(), e.getKey()))
        .sorted( (a,b) -> a.getXValue().intValue()-b.getXValue().intValue() )
        .forEach(e -> series1.getData().add(e));

Aber ich finde die Lösung von JCODA besser.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Garbage collector Allgemeine Java-Themen 3
D Garbage Collector Allgemeine Java-Themen 3
A Garbage Collector Allgemeine Java-Themen 3
A Garbage Collector in NetBeans vs. exe Anwendung Allgemeine Java-Themen 33
L Garbage Collector lässt Programm kurz hängen Allgemeine Java-Themen 10
H2SO3- SCJP garbage collector frage Allgemeine Java-Themen 13
R Garbage Collector löscht anscheinend nichts Allgemeine Java-Themen 22
S Garbage Collector entlasten Allgemeine Java-Themen 2
JStickman Der Garbage Collector Allgemeine Java-Themen 13
P Threads ohne Referenz & der Garbage Collector Allgemeine Java-Themen 2
S garbage collector prog Allgemeine Java-Themen 4
S Threads <-> Garbage Collector Allgemeine Java-Themen 2
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
P Grabage Collector Allgemeine Java-Themen 8
P Garbage Collector funktioniert nicht richtig? Allgemeine Java-Themen 12
M Problem mit garbage collector Allgemeine Java-Themen 19
R Garbage Collector rennt die ganze Zeit Allgemeine Java-Themen 7
M Garbage Collector Allgemeine Java-Themen 5
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben