Выполните итерацию содержимого карты <String, List <Object>> и назначьте значения списка <Object>в отдельный список <Double> - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть 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]

Для следующей клавиши Series 2:

xData=[0.1,0.1]
yData=[0.4,0.5]

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете сделать это с помощью итерации сбора по списку координат следующим образом:

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)));
});
0 голосов
/ 02 ноября 2018

В forEach, (k, v) представляет ключ и значение каждой пары, поэтому вам нужно получить Coordinates, а затем его x и y. Кроме того, поскольку вам не нужно определенно 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);
});

С помощью 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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...