从List <object []>构建树形关系图的有效方法

时间:2019-04-09 21:06:38

标签: java oracle algorithm performance tree

查询数据库时,它返回我List<Object[]>,其中object[]包含Parent,Child和GrandChild。我想以Map<Parent, Map<Child, List<GrandChild>>>的形式建立此树关系的地图。我想知道建立这种关系的最快方法。

我可以通过将数据库查询分解为多个查询来做到这一点,例如首先构建Map<Parent, List<Child>>,然后使用List<Child>中的每一个来检索孙子列表,但是此选项将成倍增加我需要的次数查询数据库中元素的数量是否很高,或者使用下面的代码将List转换为Map。

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 :(得分:0)

在这种情况下,有两个for循环彼此运行,即n * n循环。我们可以在另一个for循环内删除一个for循环,并在外部映射的每个键仅包含List<object>[]的对象之外运行第二个for循环。

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