生成树结构
实体类
@Accessors(chain = true)
@Data
public class Menu {
private Integer id; // 主键
private String name; // 菜单名
private Integer parentId; // 父菜单id
private Menu parent; // 父菜单
private Collection<Menu> childList;
}
工具类
public class TreeUtil {
// 生成树结构
public static Menu buildTree(List<Menu> data){
Menu ret = null;
if(data != null){
Map<Integer, Menu> map = new HashMap<>();
for(Menu menu : data){
map.put(menu.getId(), menu);
}
for(Menu menu : data){
Integer parentId = menu.getParentId();
Menu parent = map.get(parentId);
if(parent != null){
Collection<Menu> childList = parent.getChildList();
if(childList == null){
childList = new TreeSet<Menu>(new Comparator<Menu>(){
@Override
public int compare(Menu c1, Menu c2) {
Integer o1 = c1.getId();
Integer o2 = c2.getId();
if(o1 != null && o2 != null && o1.intValue() > o2.intValue()){
return 1;
}
return -1;
}
});
parent.setChildList(childList);
}
childList.add(menu);
}
if(parentId != null && parentId == -1){
ret = menu;
}
}
}
return ret;
}
// 准备数据
public static List<Menu> getData(){
ArrayList<Menu> data = new ArrayList<>();
data.add(new Menu().setId(4).setName("华为电脑").setParentId(1));
data.add(new Menu().setId(5).setName("苹果电脑").setParentId(1));
data.add(new Menu().setId(1).setName("电脑").setParentId(0));
data.add(new Menu().setId(2).setName("手机").setParentId(0));
data.add(new Menu().setId(3).setName("衣服").setParentId(0));
data.add(new Menu().setId(6).setName("小米电脑").setParentId(1));
data.add(new Menu().setId(7).setName("汽车").setParentId(0));
data.add(new Menu().setId(8).setName("红旗").setParentId(7));
data.add(new Menu().setId(9).setName("奔驰").setParentId(7));
data.add(new Menu().setId(10).setName("布加迪").setParentId(7));
data.add(new Menu().setId(11).setName("红旗 H7").setParentId(8));
data.add(new Menu().setId(12).setName("奔驰大G").setParentId(9));
data.add(new Menu().setId(13).setName("华为Mate 9 pro").setParentId(4));
data.add(new Menu().setId(14).setName("华为手机").setParentId(2));
data.add(new Menu().setId(0).setName("所有分类").setParentId(-1));
data.add(new Menu().setId(15).setName("小米手机").setParentId(2));
return data;
}
}
启动类
public class Launch {
public static void main(String[] args) {
List<Menu> data = TreeUtil.getData();
Menu menu = TreeUtil.buildTree(data);
System.out.println(menu.toString());
}
}
结果
(id=0,
name=所有分类,
parentId=-1,
parent=null,
childList=[
(id=1, name=电脑, parentId=0, parent=null, childList=[
(id=4, name=华为电脑, parentId=1, parent=null, childList=[
(id=13, name=华为Mate 9 pro, parentId=4, parent=null, childList=null)]),
(id=5, name=苹果电脑, parentId=1, parent=null, childList=null),
(id=6, name=小米电脑, parentId=1, parent=null, childList=null)]),
(id=2, name=手机, parentId=0, parent=null, childList=[
(id=14, name=华为手机, parentId=2, parent=null, childList=null),
(id=15, name=小米手机, parentId=2, parent=null, childList=null)]),
(id=3, name=衣服, parentId=0, parent=null, childList=null),
(id=7, name=汽车, parentId=0, parent=null, childList=[
(id=8, name=红旗, parentId=7, parent=null, childList=[
(id=11, name=红旗 H7, parentId=8, parent=null, childList=null)]),
(id=9, name=奔驰, parentId=7, parent=null, childList=[
(id=12, name=奔驰大G, parentId=9, parent=null, childList=null)]),
(id=10, name=布加迪, parentId=7, parent=null, childList=null)])
])