遍历Map <string,list <object >>的内容,并将List <object>的值分配到单独的List <double>

时间:2018-11-02 16:34:37

标签: java list dictionary arraylist java-8

我有一个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'sY'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 }); 内部,我想将loopX's分配给相应的Y's,但到目前为止没有成功。

问题之一是listsXY对象相关联,所以我不能仅仅将它们添加到{{ 1}}。我面临的另一个问题是我无法与Coordinates分开获得listDouble。我尝试过XY,但是没有运气。

我希望列表包含的示例:

对于list getX(),生成的getY()将如下:

key

对于下一个关键系列2:

Series1

2 个答案:

答案 0 :(得分:2)

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

由于您希望每对都有一个系列,因此ArrayListxData应该在循环中:

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));

其中coordinateListList<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)));
});