Java中将List转为树形的方法
使用转换的方式
方式一:递归
public static void main(String[] args) {
List<Zone> zones = listWithTree1();
System.out.println(zones);
}
public static List<Zone> listWithTree1() {
List<Zone> allMenu = new ArrayList<>();
allMenu.add(new Zone(1,"成都",0));
allMenu.add(new Zone(2,"南昌",0));
allMenu.add(new Zone(3,"四川",0));
allMenu.add(new Zone(4,"绵阳",3));
allMenu.add(new Zone(5,"天津",3));
allMenu.add(new Zone(6,"德阳",4));
allMenu.add(new Zone(7,"西充",1));
allMenu.add(new Zone(8,"重庆",7));
List<Zone> rootMenu = new ArrayList<>();
for (Zone menu : allMenu) {
if(menu.parentId == 0){
rootMenu.add(menu);
}
}
for (Zone nav : rootMenu) {
List<Zone> childList = getChildren(nav.getId(),allMenu);
nav.setChildren(childList);
}
return rootMenu;
}
private static List<Zone> getChildren(int id, List<Zone> allMenu) {
List<Zone> childList = new ArrayList<>();
for (Zone nav : allMenu) {
if(nav.getParentId() == id){
childList.add(nav);
}
}
for (Zone nav : childList) {
nav.setChildren(getChildren(nav.getId(),allMenu));
}
if(childList.size()==0){
return new ArrayList<Zone>();
}
return childList;
}
方式二:stream
public static void main(String[] args) {
List<Zone> zones = listWithTree();
System.out.println(zones);
}
public static List<Zone> listWithTree() {
// 1、查出所有分类
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(4,"绵阳",3));
zoneList.add(new Zone(5,"天津",3));
zoneList.add(new Zone(6,"德阳",4));
zoneList.add(new Zone(7,"西充",1));
zoneList.add(new Zone(8,"重庆",7));
// 组装成父子的树形结构
//若是要去掉多余的数据zoneList换为(parentList)只有父亲的数据也就是
//获取一级分类(父类)
//List<Zone> parentList = zoneList.stream().filter(x -> x.getParentId() == 0).collect(Collectors.toList());
return zoneList.stream().filter(m1 ->
m1.getParentId() == 0
).peek(menu -> {
menu.setChildren(getChildren(menu, zoneList));
}).collect(Collectors.toList());
}
private static List<Zone> getChildren(Zone root, List<Zone> all) {
return all.stream().filter(m1 -> {
return m1.getParentId()==(root.getId());
}).peek(m1 -> {
m1.setChildren(getChildren(m1, all));
}).collect(Collectors.toList());
}
方式三:混合(速度最快)
public static void main(String[] args) {
List<Zone> zones = listWithTree();
System.out.println(zones);
}
public static List<Zone> listWithTree() {
// 1、查出所有分类
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(4,"绵阳",3));
zoneList.add(new Zone(5,"天津",3));
zoneList.add(new Zone(6,"德阳",4));
zoneList.add(new Zone(7,"西充",1));
zoneList.add(new Zone(8,"重庆",7));
//获取一级分类(父类)
List<Zone> parentList = zoneList.stream().filter(x -> x.getParentId() == 0).collect(Collectors.toList());
//获取二级分类(id作为key,子级作为value组成map)
Map<Integer, List<Zone>> listMap = zoneList.stream().collect(Collectors.groupingBy(Zone::getParentId));
//递归查询
List<Zone> list = treeCategory(parentList, listMap);
return list;
}
public static List<Zone> treeCategory(List<Zone> parentList, Map<Integer, List<Zone>> listMap){
parentList.forEach(parent-> {
List<Zone> temp = listMap.get(parent.getId());
if (temp!=null && !temp.isEmpty()){
parent.setChildren(temp);
treeCategory(parent.getChildren(), listMap);
}else{
parent.setChildren(new ArrayList<>());
}
});
return parentList;
}
实体类
public static class Zone {
int id;
String name;
int parentId;
List<Zone> children;
public Zone(int id, String name, int 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 int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public List<Zone> getChildren() {
return children;
}
public void setChildren(List<Zone> children) {
this.children = children;
}
}
版权声明:本文为xinhe96原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。