Es geht darum, alle Elemente einer java.util.Map als javafx.scene.chart.XYChart.Series einem javafx.scene.chart.XYChart hinzuzufügen.
Ausgangslage:
So funktioniert es:
Die Elemente der Map müssen allerdings in einer bestimmten Reihenfolge hinzugefügt werden. Dafür habe ich folgenden Comparator geschrieben:
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:
Hat jemand eine Lösung?
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?