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);
        }
    }
    
    
  • 相关阅读:
    vue自定义指令
    ZOJ Problem Set–2104 Let the Balloon Rise
    ZOJ Problem Set 3202 Secondprice Auction
    ZOJ Problem Set–1879 Jolly Jumpers
    ZOJ Problem Set–2405 Specialized FourDigit Numbers
    ZOJ Problem Set–1874 Primary Arithmetic
    ZOJ Problem Set–1970 All in All
    ZOJ Problem Set–1828 Fibonacci Numbers
    要怎么样调整状态呢
    ZOJ Problem Set–1951 Goldbach's Conjecture
  • 原文地址:https://www.cnblogs.com/zhizhao/p/9956158.html
Copyright © 2011-2022 走看看