java - 从 List<Object[]> 构建树关系图的有效方法

标签 java oracle algorithm performance tree

当我查询我的数据库时,它返回我 List<Object[]>其中 object[]包含 Parent、Child 和 GrandChild。我想将此树关系的 map 构建为 Map<Parent, Map<Child, List<GrandChild>>> .我想知道建立这种关系的最快方法。

我可以通过将我的数据库查询分解为多个查询来实现,例如首先构建 Map<Parent, List<Child>>然后使用每个 List<Child>检索孙子列表,但是如果元素数量很多,此选项将成倍增加我需要查询数据库的次数,或者使用以下代码将列表转换为 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;
    }

请告诉我如何减少处理时间。

最佳答案

在这种情况下,有两个 for 循环相互运行,即 n*n 循环。我们可以在另一个 for 循环中删除一个 for 循环,并在外部运行第二个 for 循环,对象只包含 List<object>[]对于外部 map 的每个键。

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

关于java - 从 List<Object[]> 构建树关系图的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601329/

相关文章:

java - 如何画颜色

mysql - SQL update 在update运行的过程中会影响它的子查询吗?

sql - 动态查询,参数不适用于 where in

mysql - 编写多个 UPDATE 查询的更有效方法

java - Spring Boot WebSecurityConfig LogoutSuccessURL 与 invalidSessionUrl

Java - 具体的链表序列化

java - float p :calendar when scrolling

c - C 中 n 数组的交集算法

php - 来自电子邮件地址的低级安全散列

java - 如何计算使用N个六面骰子得到总和X的概率