Эффективный способ построения карты отношений дерева из List<Object[]>

Когда я запрашиваю свою базу данных, она возвращает мне List<Object[]>, где object[] содержит Parent, Child и GrandChild. Я хочу построить карту отношений этого дерева как Map<Parent, Map<Child, List<GrandChild>>>. Я хочу знать самый быстрый способ построить эти отношения.

Я могу сделать это, разбив свой запрос к БД на несколько запросов, таких как первое построение Map<Parent, List<Child>>, а затем использовать каждый из List<Child> для получения списка внуков. Однако этот параметр будет экспоненциально увеличивать количество запросов к БД, если количество элементов велико. Или используйте приведенный ниже код для преобразования списка в карту.

private Map<Long, Map<String, List<String>>> objectListToMap(List<Object[]> list) {
        Map<Long, Map<String, List<String>>> hmap = new HashMap<>();
        for (Object[] object : list) {
            Map<String, List<String>> innerMap = new HashMap<>();
            if (!hmap.containsKey(Long.parseLong(object[0].toString()))) {
                hmap.put(Long.parseLong(object[0].toString()), innerMap);
            }
            for (Object[] object1 : list) {
                if (Long.valueOf(object[0].toString()).equals(Long.valueOf(object1[0].toString()))) {
                    if (!innerMap.containsKey(object1[1].toString())) {
                        innerMap.put(object1[1].toString(), new ArrayList<String>());
                    }
                    innerMap.get(object1[1].toString()).add(object1[2].toString());
                }
            }
            hmap.get(Long.valueOf(object[0].toString())).putAll(innerMap);
        }
        return hmap;
    }

Подскажите, пожалуйста, как сократить время обработки.

Во-первых, не уверен, почему вы хотите построить такую ​​сложную карту. Возможно, вам лучше разработать некоторые классы для хранения ваших данных. Например, создайте класс, такой как class MyObject { List<MyObject> children; } Вы можете легко перейти к своим внукам, начиная с родителя, точно так же, как вы проходите по дереву.

SomeDude 10.04.2019 01:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом случае есть два цикла for, работающих друг с другом, то есть n*n циклов. мы можем удалить один цикл for внутри другого цикла for и запустить второй цикл for снаружи с объектами, которые будут содержать только List<object>[] для каждого ключа внешней карты.

private Map<Long, Map<String, List<String>>> objectListToMap(List<Object[]> list) {

        List<Object[]> objList = new ArrayList<>();
        Map<Long, Map<String, List<String>>> hmap = new LinkedHashMap<>();
        Map<Long, List<Object[]>> tempmap = new LinkedHashMap<>();

        for (Object[] object : list) {
            if (!hmap.containsKey(Long.parseLong(object[0].toString()))) {
                hmap.put(Long.parseLong(object[0].toString()), new HashMap<String, List<String>>());
                tempmap.put(Long.parseLong(object[0].toString()), objList);
            }
            tempmap.get(Long.parseLong(object[0].toString())).add(object);
        }

        for (Map.Entry<Long, List<Object[]>> entry : tempmap.entrySet()) {
            Map<String, List<String>> innerMap = new LinkedHashMap<>();
            for (Object[] obj : entry.getValue()) {
                if (!innerMap.containsKey(obj[1].toString())) {
                    innerMap.put(obj[1].toString(), new ArrayList<String>());
                }
                innerMap.get(obj[1].toString()).add(obj[2].toString());
            }
            hmap.get(entry.getKey()).putAll(innerMap);
        }

        return hmap;
    }

Другие вопросы по теме