场景:有一个地区表
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))); } }
树形结构如下: