package com.fatsea.gulimall.product; import com.alibaba.fastjson.JSON; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @SpringBootTest class GulimallProductApplicationTests { class Area { // 地區編號 private Integer catId; // 地區名稱 private String name; // 地區父ID private Integer parentCid; // 地區等級:2-省、3-市、4-區縣、5-街道 private Integer cateLevel; // 地區排序值:越小越靠前 private Integer sort; // 子地區 List<Area> children; public Area() { } public Area(Integer catId, String name, Integer parentCid,Integer sort, Integer cateLevel) { this.catId = catId; this.name = name; this.parentCid = parentCid; this.sort = sort; this.cateLevel = cateLevel; } public Integer getCatId() { return catId; } public void setCatId(Integer catId) { this.catId = catId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getParentCid() { return parentCid; } public void setParentCid(Integer parentCid) { this.parentCid = parentCid; } public Integer getCateLevel() { return cateLevel; } public void setCateLevel(Integer cateLevel) { this.cateLevel = cateLevel; } public Integer getSort() { return sort; } public void setSort(Integer sort) { this.sort = sort; } public List<Area> getChildren() { return children; } public void setChildren(List<Area> children) { this.children = children; } } @Test void testDataFilter () { // 準備數據 List<Area> allArea = new ArrayList<>(); allArea.add(new Area(1, "江西",0, 14, 2)); allArea.add(new Area(2, "湖北",0, 13, 2)); allArea.add(new Area(3, "湖南",0, 12, 2)); allArea.add(new Area(4, "九江",1, 11, 3)); allArea.add(new Area(5, "南昌",1, 10, 3)); allArea.add(new Area(6, "景德鎮",1, 9, 3)); allArea.add(new Area(7, "浮樑",6, 8, 3)); allArea.add(new Area(8, "昌江",6, 7, 3)); allArea.add(new Area(9, "樂平",6, 6, 3)); allArea.add(new Area(10, "東湖區",5, 5, 4)); allArea.add(new Area(11, "南昌縣",5, 4, 4)); allArea.add(new Area(12, "新建縣",5, 3, 4)); allArea.add(new Area(13, "柴桑區",4, 2, 4)); allArea.add(new Area(14, "塔山街道",9, 1, 5)); // 篩選出省級地區:並排序 List<Area> provinceList = allArea.stream() .filter(area -> area.getCateLevel() == 2) .map((province) -> { // 針對單個省設置子級地區 province.setChildren(getChildrens(province, allArea)); return province; }).sorted((province1, province2) -> { return province1.getSort() - province2.getSort(); }).collect(Collectors.toList()); // 打印結果 System.out.println("areaList:" + JSON.toJSONString(provinceList)); /*[ {"catId":3,"cateLevel":2,"name":"湖南","parentCid":0,"sort":12,"children":[]}, {"catId":2,"cateLevel":2,"name":"湖北","parentCid":0,"sort":13,"children":[]}, {"catId":1,"cateLevel":2,"name":"江西","parentCid":0,"sort":14,"children": [ {"catId":6,"cateLevel":3,"name":"景德鎮","parentCid":1,"sort":9,"children": [ {"catId":9,"cateLevel":3,"name":"樂平","parentCid":6,"sort":6,"children": [ {"catId":14,"cateLevel":5,"children":[],"name":"塔山街道","parentCid":9,"sort":1} ] }, {"catId":8,"cateLevel":3,"children":[],"name":"昌江","parentCid":6,"sort":7}, {"catId":7,"cateLevel":3,"children":[],"name":"浮樑","parentCid":6,"sort":8} ] }, {"catId":5,"cateLevel":3,"name":"南昌","parentCid":1,"sort":10,"children": [ {"catId":12,"cateLevel":4,"name":"新建縣","parentCid":5,"sort":3,"children":[]}, {"catId":11,"cateLevel":4,"name":"南昌縣","parentCid":5,"sort":4,"children":[]}, {"catId":10,"cateLevel":4,"name":"東湖區","parentCid":5,"sort":5,"children":[]} ] }, {"catId":4,"cateLevel":3,"name":"九江","parentCid":1,"sort":11,"children": [ {"catId":13,"cateLevel":4,"name":"柴桑區","parentCid":4,"sort":2,"children":[]} ] } ] } ]*/ } // 遞歸篩選每個省級地區的子級 public List<Area> getChildrens (Area root, List<Area> allArea) { // 篩選子級 List<Area> children = allArea.stream() // 篩選出當前地區的下一級 .filter(area -> root.getCatId() == area.getParentCid()) // 嵌套,遞歸查找下一級地區 .map((area) -> { area.setChildren(getChildrens(area, allArea)); return area; // 排序 }).sorted((area1, area2) -> { return area1.getSort() - area2.getSort(); }).collect(Collectors.toList()); return children; } }