我有一个包含list
和coordinates
的对象的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's
和Y'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's
和Y's
分配给相应的lists
,但到目前为止没有成功。问题之一是
X
和Y
与Coordinates
对象相关联,因此我不能仅将它们添加到list
类型的Double
中。我面临的另一个问题是我无法与X
分开获得Y
和list
。我尝试了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,则xData
和yData
应该在循环中:
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);
});