我有一个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
的列表,以便最终创建图形({ {1}}。
到目前为止,我的处理方法如下:
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
对象相关联,所以我不能仅仅将它们添加到{{ 1}}。我面临的另一个问题是我无法与Coordinates
分开获得list
和Double
。我尝试过X
和Y
,但是没有运气。
我希望列表包含的示例:
对于list
getX()
,生成的getY()
将如下:
key
对于下一个关键系列2:
Series1
答案 0 :(得分:2)
在thread
中,forEach
代表每对密钥和值,因此您需要获取(k, v)
,然后为其x和y。另外,由于您不需要特定的Coordinates
,因此请使用LinkedList
。
由于您希望每对都有一个系列,因此ArrayList
和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);
});
API,您可以转到:
Stream
答案 1 :(得分:2)
您可以使用以下方法在坐标列表中进行收集迭代:
List<Double> xData = coordinateList.stream()
.map(Coordinates::getX)
.collect(Collectors.toCollection(LinkedList::new));
其中coordinateList
是List<Coordinate>
,如先前用于分组,并且如问题所述收集到LinkedList
,或者您可以在一次迭代中完成两个列表
coordinateList.forEach(coordinates -> {
yData.add(coordinates.getY());
xData.add(coordinates.getX());
});
注意 :我考虑过coordinateList
,它没有在分组声明中或在问题中共享之前更改过。
虽然您可能正在寻找xData和yData系列或每次迭代,并且它们可能将List<List<Double>>
作为输出,但可以这样实现:
List<List<Double>> xDatas = new ArrayList<>();
List<List<Double>> yDatas = new ArrayList<>();
newList.forEach((k,v) -> {
xDatas.add(v.stream()
.map(Coordinates::getX)
.collect(Collectors.toCollection(LinkedList::new)));
yDatas.add(v.stream()
.map(Coordinates::getY)
.collect(Collectors.toCollection(LinkedList::new)));
});