zoukankan      html  css  js  c++  java
  • java将list转为树形结构的方法

    1、通过转化成json封装数据

    原始数据如下

    [
        {
            "name":"甘肃省",
            "pid":0,
            "id":1
        },
        {
            "name":"天水市",
            "pid":1,
            "id":2
        },
        {
            "name":"秦州区",
            "pid":2,
            "id":3
        },
        {
            "name":"北京市",
            "pid":0,
            "id":4
        },
        {
            "name":"昌平区",
            "pid":4,
            "id":5
        }
    ]
    

    现需要是使用java将以上数据转为树形结构,转化后下的结构如下

    [
        {
            "children":[
                {
                    "children":[
                        {
                            "name":"秦州区",
                            "pid":2,
                            "id":3
                        }
                    ],
                    "name":"天水市",
                    "pid":1,
                    "id":2
                }
            ],
            "name":"甘肃省",
            "pid":0,
            "id":1
        },
        {
            "children":[
                {
                    "name":"昌平区",
                    "pid":4,
                    "id":5
                }
            ],
            "name":"北京市",
            "pid":0,
            "id":4
        }
    ]
    

    代码如下

    /**
    
    - listToTree
    - <p>方法说明<p>
    - 将JSONArray数组转为树状结构
    - @param arr 需要转化的数据
    - @param id 数据唯一的标识键值
    - @param pid 父id唯一标识键值
    - @param child 子节点键值
    - @return JSONArray
    */
    public static JSONArray listToTree(JSONArray arr,String id,String pid,String child){
       JSONArray r = new JSONArray();
       JSONObject hash = new JSONObject();
       //将数组转为Object的形式,key为数组中的id
       for(int i=0;i<arr.size();i++){
      JSONObject json = (JSONObject) arr.get(i);
      hash.put(json.getString(id), json);
       }
       //遍历结果集
       for(int j=0;j<arr.size();j++){
      //单条记录
      JSONObject aVal = (JSONObject) arr.get(j);
      //在hash中取出key为单条记录中pid的值
      JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString());
      //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中
      if(hashVP!=null){
         //检查是否有child属性
         if(hashVP.get(child)!=null){
            JSONArray ch = (JSONArray) hashVP.get(child);
            ch.add(aVal);
            hashVP.put(child, ch);
         }else{
            JSONArray ch = new JSONArray();
            ch.add(aVal);
            hashVP.put(child, ch);
         }
      }else{
         r.add(aVal);
      }
       }
       return r;
    }
    测试代码如下
    public static void main(String[] args){
       List<Map<String,Object>> data = new ArrayList<>();
       Map<String,Object> map = new HashMap<>();
       map.put("id",1);
       map.put("pid",0);
       map.put("name","甘肃省");
       data.add(map);
       Map<String,Object> map2 = new HashMap<>();
       map2.put("id",2);
       map2.put("pid",1);
       map2.put("name","天水市");
       data.add(map2);
       Map<String,Object> map3 = new HashMap<>();
       map3.put("id",3);
       map3.put("pid",2);
       map3.put("name","秦州区");
       data.add(map3);
       Map<String,Object> map4 = new HashMap<>();
       map4.put("id",4);
       map4.put("pid",0);
       map4.put("name","北京市");
       data.add(map4);
       Map<String,Object> map5 = new HashMap<>();
       map5.put("id",5);
       map5.put("pid",4);
       map5.put("name","昌平区");
       data.add(map5);
       System.out.println(JSON.toJSONString(data));
       JSONArray result = listToTree(JSONArray.parseArray(JSON.toJSONString(data)),"id","pid","children");
       System.out.println(JSON.toJSONString(result));
    }
    
    

    2、通过java8 stream转换

    我在网上找了很多方法,自己写的这个思路清晰,代码量少,希望能找到志同道合的朋友,看看还有没有优化的地方。

    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class ZhField {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private String id;
    
        /**
         * 上级领域id
         */
        @Column(name = "parent_id")
        private String parentId;
    
        /**
         * 领域名称
         */
        private String name;
    
        /**
         * 排序
         */
        private Integer sort;
    
    }
    
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.Serializable;
    import java.util.List;
    import java.util.Map;
    
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class TreeMenuNode implements Serializable {
    	private String id;
    	private String parentId;
    	private String name;
    	private Integer sort;
    	private List<TreeMenuNode> children;
    	private Boolean isAble;
    
    	/**20180929zhw添加 树的额外属性(至少含有父节点ID:"parentId")**/
    	private Map<String,Object> attributes;
    }
    
    
    package com.egaoqi.service.impl.company;
    
    import com.egaoqi.entity.ZhField;
    import com.egaoqi.util.TreeMenuNode;
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    /**
     * @author zhizhao
     * @description
     * @create 2018-11-14 9:07
     */
    public class toModel {
    
        private static void forEach(Map<String, List<TreeMenuNode>> collect, TreeMenuNode treeMenuNode) {
            List<TreeMenuNode> treeMenuNodes = collect.get(treeMenuNode.getId());
            if(collect.get(treeMenuNode.getId())!=null){
                //排序
                treeMenuNodes.sort((u1, u2) -> u1.getSort().compareTo(u2.getSort()));
                treeMenuNodes.stream().sorted(Comparator.comparing(TreeMenuNode::getSort)).collect(Collectors.toList());
                treeMenuNode.setChildren(treeMenuNodes);
                treeMenuNode.getChildren().forEach(t->{
                    forEach(collect,t);
                });
            }
        }
    
        public static void main(String[] args) {
            List<ZhField> zhFields = new ArrayList<>();
            List<TreeMenuNode> treeNodeList = new ArrayList<>();
            //转换数据,这个是前端需要的格式。
            zhFields.forEach(t->{
                TreeMenuNode treeMenuNode = new TreeMenuNode();
                treeMenuNode.setId(t.getId());
                treeMenuNode.setParentId(t.getParentId());
                treeMenuNode.setName(t.getName());
                treeMenuNode.setSort(t.getSort());
                treeNodeList.add(treeMenuNode);
            });
            //分组
            Map<String, List<TreeMenuNode>> collect = treeNodeList.stream().collect(Collectors.groupingBy(TreeMenuNode::getParentId));
            //树形结构 肯定有一个根部,我的这个根部的就是parentId.euqal("0"),而且只有一个就get("0")
            TreeMenuNode treeMenuNode = collect.get("0").get(0);
            //拼接数据
            forEach(collect, treeMenuNode);
        }
    }
  • 相关阅读:
    python IDE安装-mac
    tokudb引擎安装-2
    MariaDB10.2.X-新特性2-支持check约束and with as
    MariaDB10.2.X-新特性1-支持分析函数
    MySQL5.7表空间加密
    MySQL 5.7 SYS scheme解析
    tcpdump抓SQL
    pt-online-schema-change
    查看锁信息
    onlineDDL测试
  • 原文地址:https://www.cnblogs.com/adjk/p/12766993.html
Copyright © 2011-2022 走看看