我有一个包含listcoordinates的对象的name。下面是打印列表的示例:

[X=0.1, Y=0.1, name=Series1]
[X=0.1, Y=0.2, name=Series1]
[X=0.1, Y=0.3, name=Series1]
[X=0.1, Y=0.4, name=Series2]
[X=0.1, Y=0.5, name=Series2]

我想要实现的是基于name将它们分组在一起,可以通过以下Java 8操作来完成:
Map<String, List<Coordinates>> newList = coordinateList.stream()
           .collect(Collectors.groupingBy(Coordinates::getName));

输出:
Series1=[[X=0.1, Y=0.1],[X=0.1, Y=0.2],[X=0.1, Y=0.3]]
Series2=[[X=0.1, Y=0.4],[X=0.1, Y=0.5]]

我尚无法实现的最后一步是遍历Map,创建X'sY's的列表,以便最终创建一个图形(chart.addSeries(name, xData, yData);)

到目前为止,我的处理方法如下:
    List<Double> xData = new LinkedList<Double>();
    List<Double> yData = new LinkedList<Double>();

    newList.forEach((k, v) -> {
        //TO-DO
    });

loop内部,我想将X'sY's分配给相应的lists,但到目前为止没有成功。

问题之一是XYCoordinates对象相关联,因此我不能仅将它们添加到list类型的Double中。我面临的另一个问题是我无法与X分开获得Ylist。我尝试了getX()getY(),但是没有运气。

我希望列表包含的示例:

对于key Series1,生成的lists将如下所示:
xData=[0.1,0.1,0.1]
yData=[0.1,0.2,0.3]

对于下一个关键系列2:
xData=[0.1,0.1]
yData=[0.4,0.5]

最佳答案

forEach中,(k, v)表示每个对的键和值,因此您需要获取Coordinates,然后获取其x和y。另外,由于您不需要特定的LinkedList,因此请使用ArrayList

如果您希望每对都有一个Series,则xDatayData应该在循环中:

for (Map.Entry<String, List<Coordinates>> serie : newList.entrySet()) {
    List<Double> xData = new ArrayList<>();
    List<Double> yData = new ArrayList<>();

    for (Coordinates coord : serie.getValue()) {
        xData.add(coord.getX());
        yData.add(coord.getY());
    }

    chart.addSeries(serie.getKey(), xData, yData);
}

选择第一个选项,因为它更易于使用,请不要使用forEach快速:
newList.forEach((key, value) -> {
    List<Double> xData = new ArrayList<>();
    List<Double> yData = new ArrayList<>();

    value.forEach(c -> {
        xData.add(c.getX());
        yData.add(c.getY());
    });

    chart.addSeries(key, xData, yData);
});

使用Stream API,您可以转到:
newList.forEach((key, value) -> {
   List<Double> xData = value.stream().map(Coordinates::getX).collect(Collectors.toList());
   List<Double> yData = value.stream().map(Coordinates::getY).collect(Collectors.toList());
   chart.addSeries(key, xData, yData);
});

09-25 19:36