zoukankan      html  css  js  c++  java
  • Java list列表转Tree树形结构

    场景:有一个地区表

    CREATE TABLE `zone`  (
      `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `parent_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

    实体类

    package com.springbootemaildemo.tree.zone;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Zone {
        String id;
        String name;
        String parentId;
        List<Zone> children;
    
        public Zone(String id, String name, String parentId) {
            this.id = id;
            this.name = name;
            this.parentId = parentId;
        }
    
        public void addChildren(Zone zone) {
            if (children == null) {
                children = new ArrayList<>();
            }
            children.add(zone);
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getParentId() {
            return parentId;
        }
    
        public void setParentId(String parentId) {
            this.parentId = parentId;
        }
    
        public List<Zone> getChildren() {
            return children;
        }
    
        public void setChildren(List<Zone> children) {
            this.children = children;
        }
    }

    工具类

    package com.springbootemaildemo.tree.zone;
    
    import org.apache.commons.collections4.CollectionUtils;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    public class ZoneUtils {
    
        /**
         * 方法一:两层循环
         *
         * @param zoneList
         * @return
         */
        public static List<Zone> buildTree2(List<Zone> zoneList) {
            List<Zone> result = new ArrayList<>();
            for (Zone zone : zoneList) {
                if (zone.parentId.equals("0")) {
                    result.add(zone);
                }
                for (Zone child : zoneList) {
                    if (child.parentId.equals(zone.id)) {
                        zone.addChildren(child);
                    }
                }
            }
            return result;
        }
    
        /**
         * 方法二 :两次遍历
         * 推荐使用方法二
         *
         * @param zoneList
         * @return
         */
        public static List<Zone> buildTree3(List<Zone> zoneList) {
            Map<String, List<Zone>> zoneByParentIdMap = new HashMap<>();
            zoneList.forEach(zone -> {
                List<Zone> children = zoneByParentIdMap.getOrDefault(zone.parentId, new ArrayList<>());
                children.add(zone);
                zoneByParentIdMap.put(zone.parentId, children);
            });
            zoneList.forEach(zone -> zone.children = zoneByParentIdMap.get(zone.id));
            return zoneList.stream()
                    .filter(v -> v.parentId.equals("0"))
                    .collect(Collectors.toList());
        }
    
        /**
         * 方法二 :使用java8的stream的方式
         * 推荐使用方法二
         *
         * @param zoneList
         * @return
         */
        public static List<Zone> buildTree3_01(List<Zone> zoneList) {
            Map<String, List<Zone>> zoneByParentIdMap = zoneList.stream().collect(Collectors.groupingBy(Zone::getParentId));
            zoneList.forEach(zone -> zone.children = zoneByParentIdMap.get(zone.id));
            return zoneList.stream().filter(v -> v.parentId.equals("0")).collect(Collectors.toList());
        }
    }

    测试类

    package com.springbootemaildemo.tree.zone;
    
    import com.alibaba.fastjson.JSON;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) {
            List<Zone> zoneList = new ArrayList<>();
            zoneList.add(new Zone("1", "上海", "0"));
            zoneList.add(new Zone("2", "北京", "0"));
            zoneList.add(new Zone("3", "河南", "0"));
            zoneList.add(new Zone("31", "郑州", "3"));
            zoneList.add(new Zone("32", "洛阳", "3"));
            zoneList.add(new Zone("321", "洛龙", "32"));
            zoneList.add(new Zone("11", "松江", "1"));
            zoneList.add(new Zone("111", "泗泾", "11"));
            System.out.println("=======================2========================");
            List<Zone> rootZone2 = ZoneUtils.buildTree2(zoneList); // 测试第二种方法
            rootZone2.stream().forEach(item -> System.out.println(JSON.toJSONString(item)));
            System.out.println("===========================3====================");
            List<Zone> rootZone3 = ZoneUtils.buildTree3(zoneList); // 测试第三种方法
            rootZone3.stream().forEach(item -> System.out.println(JSON.toJSONString(item)));
            System.out.println("===========================4===================");
            List<Zone> rootZone3_01 = ZoneUtils.buildTree3_01(zoneList); // 测试第三种方法
            rootZone3_01.stream().forEach(item -> System.out.println(JSON.toJSONString(item)));
    
        }
    }

    树形结构如下:

     

  • 相关阅读:
    初认识AngularJS
    (imcomplete) UVa 10127 Ones
    UVa 10061 How many zero's and how many digits?
    UVa 11728 Alternate Task
    UVa 11490 Just Another Problem
    UVa 10673 Play with Floor and Ceil
    JSON对象和字符串的收发(JS客户端用typeof()进行判断非常重要)
    HTML.ActionLink 和 Url.Action 的区别
    EASYUI TREE得到当前节点数据的GETDATA方法
    jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)
  • 原文地址:https://www.cnblogs.com/weigy/p/13193646.html
Copyright © 2011-2022 走看看