Преобразование списка в многомерную карту

#java #java-8

#java #java-8

Вопрос:

Я хотел бы преобразовать (с помощью Java8) список (JSON) данных в иерархическую структуру.

Не могли бы вы сказать мне, какой наилучший способ справиться с этим?

Как я могу преобразовать arraylist в многомерную карту?

Проблема заключается в чем-то вроде преобразования этого:

 {
"server": "Manufacturer Co.",
"vehicles": [
    {
        "year": 2018,
        "model": "Ford Explorer (1)",
        "category": "4WD"
    },
    {
        "year": 2018,
        "model": "Ford Explorer (2)",
        "category": "4WD"
    },
    {
        "year": 2017,
        "model": "Ford Mustang (3)",
        "category": "2WD"
    }
    {
        "year": 2017,
        "model": "Ford Mustang 4WD (4)",
        "category": "4WD"
    }
}
 

в это

 vehicles
-- year 2018
----- category: 4WD
---------- Ford Explorer (1)
---------- Ford Explorer (2)
-- year 2017
----- category: 2WD
---------- Ford Mustang (3)
----- category: 4WD
---------- Ford Mustang (4)
 

Спасибо за ваше время

Комментарии:

1. Если вы хотите преобразовать объект ArrayList в карту, вам нужно показать нам определение и содержимое этого списка, а не какую-либо структуру json. Добавьте код для вашего списка и то, что вы пробовали при преобразовании его в карту.

Ответ №1:

Вы должны использовать несколько groupingBy , а затем использовать mapping для сбора свойства модели в список.

Я предполагал, что у вас есть модель, подобная этой:

 public class Vehicle {
    private int year;
    private String model;
    private String category;

    //other 
}


Map<Integer,Map<String,List<String>>> result =  vehicles.stream()
            .collect(Collectors.groupingBy(Vehicle::getYear,
                    Collectors.groupingBy(Vehicle::getCategory, 
                            Collectors.mapping(Vehicle::getModel, Collectors.toList()))));
 

Комментарии:

1. Вау! Вы спасаете мою неделю! Большое вам спасибо!

Ответ №2:

Существует два подхода. Первым было бы создать a Map с ключом Year Map s с ключом Category Model s. Выполните итерацию по всем транспортным средствам, создайте запись за год, если она не существует, добавьте категорию, если она не существует, и добавьте модель, если она не существует.

Немного более элегантным подходом было бы использовать базу данных в памяти. Создайте таблицу vehicles со столбцами year , category model а затем запросите ее с помощью:

 select year, category, model
from   vehicle
order by year, category;