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

    }
}

樹形結構如下:

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM