Java 数据库查询结果的list转树

package com.example.dataStructure.collectionToTree;

import com.alibaba.fastjson.JSON;
import org.springframework.util.StringUtils;

import java.util.*;

public class KypCodeMappingTree {

    Node[] heads;

    public KypCodeMappingTree(List<Map<String,String>> list) {
        this.heads = this.initHeads(list);
        this.treeIfy(list);
    }

    /**
     * 初始化头节点
     * @param list
     * @return
     */
    private Node[] initHeads(List<Map<String,String>> list){
        List<Node> headList = new ArrayList<Node>();
        if(list == null || list.isEmpty()){
            return null;
        }
        for (Map<String,String> map:list
             ) {
            if(StringUtils.isEmpty(this.mapPreWords(map))){
                Node node = new Node();
                node.setKey(this.mapWords(map));
                headList.add(node);
            }
        }
        Node[] heads = new Node[headList.size()];
        return headList.toArray(heads);
    }

    public String mapWords(Map map){
        return map.get("columnName")+","+map.get("valueCode");
    }

    public String mapPreWords(Map map){
        if(StringUtils.isEmpty(map.get("preColumnName")) || StringUtils.isEmpty(map.get("preValueCode"))){
            return null;
        }
        return map.get("preColumnName")+","+map.get("preValueCode");
    }

    /**
     * 树化
     * @param list
     */
    protected void treeIfy(List<Map<String,String>> list){
        // 将list转换成父(key)子(value)的map
        Map<String,List<String>> map = reverse(list);
        if(this.heads != null && heads.length>0){
            for (Node head:heads
             ) {
                this.addChildren(head,map);
            }
        }
    }

    /**
     * 添加子节点
     * @param head
     * @param map
     */
    protected void addChildren(Node head,Map<String,List<String>> map){
        if(head==null){
            return;
        }
        Queue<Node> q=new LinkedList<>();
        q.add(head);
        while (!q.isEmpty()){
            Node curr = q.poll();
            List<String> childList = map.get(curr.getKey());
            if(childList != null && !childList.isEmpty()){
                for (String childKey:childList
                     ) {
                    Node child = new Node();
                    child.setKey(childKey);
                    curr.getChildren().add(child);
                    q.add(child);
                }

            }
        }
    }

    /**
     * 将list转成含有父子节点层级关系的map,key代表父节点,map中的value值是list集合,代表子节点列表
     * @param list
     * @return
     */
    protected Map<String,List<String>> reverse(List<Map<String,String>> list){
        if(list == null || list.isEmpty()){
            return null;
        }
        Map<String,List<String>> map = new HashMap<>();
        for (Map<String,String> m:list
             ) {
            if(!map.containsKey(this.mapWords(m))){
                List<String> mapL = new ArrayList<>();
                mapL.addAll(this.findChildren(list,m));
                map.put(this.mapWords(m),mapL);
            }
        }
        return map;
    }

    /**
     * 获取节点map的value,即子节点的key的list
     * @param list
     * @param map
     * @return
     */
    public List<String> findChildren(List<Map<String,String>> list,Map<String,String> map){
        List<String> children = new ArrayList<>();
        for (Map<String,String> m:list
             ) {
            if(this.mapWords(map).equals(this.mapPreWords(m))){
                children.add(this.mapWords(m));
            }
        }
        return children;
    }

    public Node[] getHeads() {
        return heads;
    }

    public void setHeads(Node[] heads) {
        this.heads = heads;
    }

    static class Node {
        String key;
        List<Node> children = new ArrayList<>();

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public List<Node> getChildren() {
            return children;
        }

        public void setChildren(List<Node> children) {
            this.children = children;
        }
    }

    public static void main(String[] args) {
        List<Map<String,String>> list = initData();
        KypCodeMappingTree tree = new KypCodeMappingTree(list);
        System.out.println(JSON.toJSONString(tree));
    }

    public static List<Map<String,String>> initData(){
        Map k1 = (new KypCodeMapping("kyp_level1", "B2C", null, null)).objectToMap();
        Map k3 = (new KypCodeMapping("kyp_level2", "B2C固收类", "kyp_level1", "B2C")).objectToMap();
        Map k4 = (new KypCodeMapping("kyp_level2", "B2C宝宝类", "kyp_level1", "B2C")).objectToMap();
        Map k5 = (new KypCodeMapping("kyp_level2", "B2C跨境类", "kyp_level1", "B2C")).objectToMap();
        Map k6 = (new KypCodeMapping("kyp_level1", "爱理财", null, null)).objectToMap();
        Map k14 = (new KypCodeMapping("kyp_level2", "爱理财", "kyp_level1", "爱理财")).objectToMap();
        Map k15 = (new KypCodeMapping("kyp_level3", "爱理财", "kyp_level2", "爱理财")).objectToMap();
        Map k16 = (new KypCodeMapping("kyp_level4", "爱理财", "kyp_level3", "爱理财")).objectToMap();
        Map k7 = (new KypCodeMapping("kyp_level1", "投股票", null, null)).objectToMap();
        Map k9 = (new KypCodeMapping("kyp_level2", "爱理财1号", "kyp_level1", "爱理财")).objectToMap();
        Map k2 = (new KypCodeMapping("kyp_level2", "爱理财2号", "kyp_level1", "爱理财")).objectToMap();
        Map k8 = (new KypCodeMapping("kyp_level2", "爱理财3号", "kyp_level1", "爱理财")).objectToMap();
        Map k10 = (new KypCodeMapping("kyp_level3", "爱理财1号1类", "kyp_level2", "爱理财1号")).objectToMap();
        Map k11 = (new KypCodeMapping("kyp_level3", "爱理财1号2类", "kyp_level2", "爱理财1号")).objectToMap();
        Map k12 = (new KypCodeMapping("kyp_level4", "爱理财1号1类a", "kyp_level3", "爱理财1号1类")).objectToMap();
        Map k13 = (new KypCodeMapping("kyp_level4", "爱理财1号1类b", "kyp_level3", "爱理财1号1类")).objectToMap();
        List<Map<String,String>> list = new ArrayList<>();
        list.add(k1);list.add(k2);list.add(k3);list.add(k4);list.add(k5);list.add(k6);list.add(k7);
        list.add(k8);list.add(k9);list.add(k10);list.add(k11);list.add(k12);list.add(k13);list.add(k14);
        list.add(k15);list.add(k16);
        return list;
    }
}

结果:{"heads":[{"children":[{"children":[],"key":"kyp_level2,B2C固收类"},{"children":[],"key":"kyp_level2,B2C宝宝类"},{"children":[],"key":"kyp_level2,B2C跨境类"}],"key":"kyp_level1,B2C"},{"children":[{"children":[],"key":"kyp_level2,爱理财2号"},{"children":[],"key":"kyp_level2,爱理财3号"},{"children":[{"children":[{"children":[],"key":"kyp_level4,爱理财1号1类a"},{"children":[],"key":"kyp_level4,爱理财1号1类b"}],"key":"kyp_level3,爱理财1号1类"},{"children":[],"key":"kyp_level3,爱理财1号2类"}],"key":"kyp_level2,爱理财1号"},{"children":[{"children":[{"children":[],"key":"kyp_level4,爱理财"}],"key":"kyp_level3,爱理财"}],"key":"kyp_level2,爱理财"}],"key":"kyp_level1,爱理财"},{"children":[],"key":"kyp_level1,投股票"}]}

 

{
    "heads":[
        {
            "children":[
                {
                    "children":[

                    ],
                    "key":"kyp_level2,B2C固收类"
                },
                {
                    "children":[

                    ],
                    "key":"kyp_level2,B2C宝宝类"
                },
                {
                    "children":[

                    ],
                    "key":"kyp_level2,B2C跨境类"
                }
            ],
            "key":"kyp_level1,B2C"
        },
        {
            "children":[
                {
                    "children":[

                    ],
                    "key":"kyp_level2,爱理财2号"
                },
                {
                    "children":[

                    ],
                    "key":"kyp_level2,爱理财3号"
                },
                {
                    "children":[
                        {
                            "children":[
                                {
                                    "children":[

                                    ],
                                    "key":"kyp_level4,爱理财1号1类a"
                                },
                                {
                                    "children":[

                                    ],
                                    "key":"kyp_level4,爱理财1号1类b"
                                }
                            ],
                            "key":"kyp_level3,爱理财1号1类"
                        },
                        {
                            "children":[

                            ],
                            "key":"kyp_level3,爱理财1号2类"
                        }
                    ],
                    "key":"kyp_level2,爱理财1号"
                },
                {
                    "children":[
                        {
                            "children":[
                                {
                                    "children":[

                                    ],
                                    "key":"kyp_level4,爱理财"
                                }
                            ],
                            "key":"kyp_level3,爱理财"
                        }
                    ],
                    "key":"kyp_level2,爱理财"
                }
            ],
            "key":"kyp_level1,爱理财"
        },
        {
            "children":[

            ],
            "key":"kyp_level1,投股票"
        }
    ]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值