Ich habe die Datenstruktur MyPojo
genannt, die Felder hat, die time
, name
und timetaken
genannt werden (alle sind in Strings). Ich versuche, einige Gruppierung zu tun, wie folgt:Java 8 sammeln und ändern Sie das Format des Ergebnisses
List<MyPojo> myPojos = Arrays.asList(
new MyPojo("2017", "ABC", "30"),
new MyPojo("2017", "ABC", "20"),
new MyPojo("2016", "ABC", "25"),
new MyPojo("2017", "XYZ", "40")
);
Map<String, Map<String, Double>> resultMap = myPojos.stream()
.collect(Collectors.groupingBy(MyPojo::getName,
Collectors.groupingBy(MyPojo::getTime,
Collectors.averagingDouble(MyPojo::getTimeTakenAsDouble))));
Bitte beachten Sie, dass ich eine Methode habe getTimeTakenAsDouble
genannt timetaken
String doppelten Wert zu konvertieren.
Daraus ergibt sich wie folgt:
{ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0}}
jedoch die Daten entweder in folgendem Format mein Frontend Entwickler wollte: zu
{ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0, 2016=0.0}}
oder
[
{
"time": "2017",
"name": "ABC",
"avgTimeTaken": 25.0
},
{
"time": "2017",
"name": "XYZ",
"avgTimeTaken": 40.0
},
{
"time": "2016",
"name": "ABC",
"avgTimeTaken": 25.0
},
{
"time": "2016",
"name": "XYZ",
"avgTimeTaken": 0.0
}
]
Ich denke, Führen Sie Iterationen auf dem resultMap
durch und bereiten Sie das 2. Format vor. Ich versuche, die Iteration erneut auf der resultMap
durchzuführen. Gibt es einen anderen Weg, damit umzugehen?
Was ist 'distinctYears' hier? –
@VimalrajSelvam mein schlechtes. gerade hinzugefügt – Eugene
Dies ist ein guter Ansatz. Aber wenn ich das tun musste, habe ich es umgekehrt gemacht: Ich habe zuerst eine Karte erstellt und sie mit allen * zero * Einträgen für jede mögliche Gruppe gefüllt und dann einen Collector benutzt (entweder 'groupingBy' oder' toMap ') mit einem benutzerdefinierten Kartenlieferanten'() -> myMapWithZeroes'. –