首页 > 试题广场 >

假设菜单树形数据在MySQL中是以记录pid(父级菜单主键)

[问答题]
假设菜单树形数据在MySQL中是以记录pid(父级菜单主键)形式存储, 请实现getMenuTree方法。
public class Menu {
    private int id; // 主键,菜单id
    private String name; // 菜单名称
    private int pid; // 菜单父id,根节点pid=0
    private List<Menu> children; // 下级菜单
    // 省略set、get等方法。
}
public Menu getMenuTree(List<Menu> menuList) {
  // TODO
  return rootMenu;
}

要求如下:

1. 要有清晰的代码。

getMenuTree方法最优时间复杂度为0(n)。


//首先将list转成Map,key为菜单ID
//遍历list,将PID为0的作为根节点,
Map<Integer,Menu> map = list.stream().collect(Collectors.toMap(Menu::getId, v -> v, (k1, k2) -> k1));
Menu rootMenu = null;//根节点
for(Menu menu : list)
{
    if(menu.getPid() == 0){
        rootMenu = menu;
    }else{
        //根据父节ID点找出对应父节点
        Menu pMenu = map(menu.getPid());
        pMenu.addChildren(menu);//addChildren方法要自己写
    }
}

//最后return出,根节点
return rootMenu;

发表于 2019-10-25 09:22:57 回复(7)
 public Menu  buildTree(List<Menu> menus){
        Menu permission = Menu();
        Map<Integer,Menu> permissionMap = new HashMap<>();
        for (Menup : menus) {
            permissionMap.put(p.getId(),p);
        }
        
        for (Menup : menus) {
            Menu child = p;
            if(child.getPid() == 0) {
                permission.add(child);
            }else {
                Menu parent = permissionMap.get(child.getPid());
                parent.getChildren().add(child);
            }
        }
        return permission;
    }
发表于 2020-09-15 14:34:04 回复(0)
Menu rootMenu = menuList.stream().sorted(Comparator.comparing(Menu::getId)).collect(Collector.toList()).get(0);
编辑于 2019-10-29 16:38:32 回复(0)
其实就是用个递归
发表于 2019-11-17 16:56:04 回复(0)
我想问的是什么场景下需要根据子菜单列表查询根目录?
发表于 2019-11-17 15:15:26 回复(0)
import java.util.ArrayList; import java.util.List; //递归寻找子菜单 public class Bishi2{ public static void main(String[] args) { List<menu> menuList = new ArrayList<>(); menuList.add(new Menu(1,"1",0)); menuList.add(new Menu(2,"2",1)); menuList.add(new Menu(3,"3",2)); menuList.add(new Menu(4,"4",3)); menuList.add(new Menu(5,"5",4)); menuList.add(new Menu(6,"6",4)); Menu tree = Menu.getMenuTree(menuList); System.out.println(1); } } class Menu { private int id; // 主键,菜单id private String name; // 菜单名称 private int pid; // 菜单父id,根节点pid=0 private List<menu> children; // 下级菜单 Menu(){} Menu(int id,String name, int pid){ this.id = id; this.name = name; this.pid = pid; this.children = new ArrayList<menu>(); } // 省略set、get等方法。 public static Menu getMenuTree(List<menu> menuList) { // TODO Menu rootMenu = new Menu(); for (Menu m :menuList ) { if(m.pid==0){rootMenu=m;break;} } rootMenu = getChildren(menuList,rootMenu); return rootMenu; } public static Menu getChildren(List<menu> menuList,Menu m){ for (Menu cm:menuList ) { if(cm.pid==m.id&&cm.id!=m.id){ m.children.add(getChildren(menuList,cm)); } } return m; } } </menu></menu></menu></menu></menu>
发表于 2019-11-14 20:37:43 回复(0)
这个题用递归不行吗
发表于 2019-11-08 18:49:52 回复(1)