地区表
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;
实体类
public class Zone {
private String id;
private String name;
private String parentId;
private List<Zone> children;
}
工具类
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());
}
}