需求
返回城市列表(需展示层级关系)
思路
获取所有数据,先将第一层拆出来,再根据第一层的id递归一层一层往下获取。
代码
实体类
static class Recursion{
private Integer id;
/**名称*/
private String name;
/**上级id*/
private Integer upId;
/**下级城市集合*/
private List<Recursion> list;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getUpId() {
return upId;
}
public void setUpId(Integer upId) {
this.upId = upId;
}
public List<Recursion> getList() {
return list;
}
public void setList(List<Recursion> list) {
this.list = list;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.NO_CLASS_NAME_STYLE)
.append("id", getId())
.append("name", getName())
.append("upid", getUpId())
.append("list", getList())
.toString();
}
public static List<Recursion> getRecursionList(){
DemoTest.Recursion recursion1=new DemoTest.Recursion();
recursion1.setId(1);
recursion1.setName("省1");
DemoTest.Recursion recursion2=new DemoTest.Recursion();
recursion2.setId(2);
recursion2.setName("省2");
DemoTest.Recursion recursion3=new DemoTest.Recursion();
recursion3.setId(3);
recursion3.setName("省3");
DemoTest.Recursion recursion4=new DemoTest.Recursion();
recursion4.setId(4);
recursion4.setName("市1");
recursion4.setUpId(1);
DemoTest.Recursion recursion5=new DemoTest.Recursion();
recursion5.setId(5);
recursion5.setName("市2");
recursion5.setUpId(2);
DemoTest.Recursion recursion6=new DemoTest.Recursion();
recursion6.setId(6);
recursion6.setName("市3");
recursion6.setUpId(3);
DemoTest.Recursion recursion7=new DemoTest.Recursion();
recursion7.setId(7);
recursion7.setName("县1");
recursion7.setUpId(4);
DemoTest.Recursion recursion8=new DemoTest.Recursion();
recursion8.setId(8);
recursion8.setName("县2");
recursion8.setUpId(5);
DemoTest.Recursion recursion9=new DemoTest.Recursion();
recursion9.setId(9);
recursion9.setName("县3");
recursion9.setUpId(6);
DemoTest.Recursion recursion10=new DemoTest.Recursion();
recursion10.setId(10);
recursion10.setName("镇1");
recursion10.setUpId(7);
List<DemoTest.Recursion> list=new ArrayList<>();
list.add(recursion1);
list.add(recursion2);
list.add(recursion3);
list.add(recursion4);
list.add(recursion5);
list.add(recursion6);
list.add(recursion7);
list.add(recursion8);
list.add(recursion9);
list.add(recursion10);
return list;
}
}
方法
/**
* 测试递归
*/
@Test
public void test4() {
List<Recursion> list = DemoTest.Recursion.getRecursionList();
//先找第一层
List<Recursion> recursionList =
list.stream().filter(data->data.getUpId()==null)
.collect(Collectors.toList());
//再按第一层遍历
recursionList=getRecursion(list,recursionList);
recursionList.stream().forEach(data->{
System.out.println(data);
});
String json=JSONObject.toJSONString(recursionList);
System.out.println(json);
}
/**
* 遍历第一层
*/
private List<Recursion> getRecursion(List<Recursion> list,List<Recursion> data){
if(data==null || data.size()==0) {
return data;
}
for(Recursion recursion : data) {
List<Recursion> res= getDow(recursion,list);
if(res!=null) {
recursion.setList(res);
}
}
return data;
}
/**
* 获取list里data的下一层
*/
private List<Recursion> getDow(Recursion data,List<Recursion> list){
List<Recursion> collect =
list.stream().filter(recursion->data.getId().equals(recursion.getUpId()))
.collect(Collectors.toList());
if(collect==null || collect.size()==0) {
return null;
}
for(Recursion dow : collect) {
List<Recursion> res= getDow(dow,list);
if(res!=null) {
dow.setList(res);
}
}
return collect;
}
打印结果:
[id=1,name=省1,upid=,
list=[[id=4,name=市1,upid=1,
list=[[id=7,name=县1,upid=4,
list=[[id=10,name=镇1,upid=7,
list=]]]]]]]
[id=2,name=省2,upid=,
list=[[id=5,name=市2,upid=2,
list=[[id=8,name=县2,upid=5,
list=]]]]]
[id=3,name=省3,upid=,
list=[[id=6,name=市3,upid=3,
list=[[id=9,name=县3,upid=6,
list=]]]]]