Эффективный способ построить карту дерева отношений из списка - PullRequest
0 голосов
/ 10 апреля 2019

Когда я запрашиваю свою базу данных, она возвращает мне 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;
    }

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

1 Ответ

0 голосов
/ 17 мая 2019

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