java树形菜单过滤掉父级中断的数据&完全匹配父子级

树形菜单过滤

有两个树形结构的菜单数据小功能有点意思,特地记录一下

(1)过滤掉父级中断的数据

菜单列表数据,本来是,如果勾选了一个子级菜单,那么其所有上层父级菜单也会勾选保存到后台,此数据用户前端页面查询进行渲染成树形菜单,当然也可以后端直接处理成树形菜单(后端处理成树形菜单,那么父级中断的菜单就会直接过滤掉,不需要再处理),但是这个接口是个非树形列表,那么就需要简单过滤下(一般前端组件其实也不会报错,对于这种数据)

(2) 完全匹配父子级每一层

用于一些父子级名称匹配批量导入的功能,需要在导入excel中完整输入父子级,比如数据是 首页-工作台-用户列表,那么用户在excel中输入 首页-工作台1-用户列表或者 首页-用户列表这种不完全匹配的数据就需要过滤掉或业务异常中断提醒,完全匹配是因为数据库存的是id唯一,名称是可以跨级重复的,对于用户来说,他们只知道名称。

实操:

pom依赖

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-core</artifactId>
    </dependency>

(1)过滤中断

List<MenuDto> menuList = new ArrayList<>();
List<MenuDto> finalDtoList = menuList ;
menuList.stream().filter(p -> p.getPid().equals(0) || finalDtoList.stream()
                    .allMatch(parent -> parent.getPid().equals(p.getId())))
                    .collect(Collectors.toList());

(2)完全匹配

/**
 * 匹配分类,严格从顶级到末级排序
 * @param nameList 分类名称 
 * @param treeList 树形列表
 * @return 末级分类
 */
public static Tree<String> matchCatalog(List<String> nameList, List<Tree<String>> treeList) {
    if (ObjectUtils.isEmpty(nameList) || ObjectUtils.isEmpty(treeList)) {
        return new Tree<>();
    }
    String targetName = nameList.get(0);
    for (Tree<String> node : treeList) {
        if (node.getName().equals(targetName)) {
            if (nameList.size() == 1) {
                return node;
            } else {
                return matchCatalog(nameList.subList(1, nameList.size()), node.getChildren());
            }
        }
    }
    return new Tree<>();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用递归算法来构建树形菜单,首先需要去重,可以使用 HashSet 或者 LinkedHashSet 来去重。然后,您可以将去重后的数据按照父子关系进行排序,再使用递归算法构建树形菜单。以下是示例代码: ``` import java.util.*; public class TreeMenuBuilder { public static void main(String[] args) { List<Menu> menus = new ArrayList<>(); menus.add(new Menu(1, "菜单1", 0)); menus.add(new Menu(2, "菜单2", 0)); menus.add(new Menu(3, "菜单3", 1)); menus.add(new Menu(4, "菜单4", 1)); menus.add(new Menu(5, "菜单5", 2)); menus.add(new Menu(6, "菜单6", 3)); menus.add(new Menu(7, "菜单7", 4)); menus.add(new Menu(8, "菜单8", 5)); menus.add(new Menu(9, "菜单9", 6)); menus.add(new Menu(10, "菜单10", 7)); Set<Menu> set = new LinkedHashSet<>(menus); List<Menu> sortedMenus = new ArrayList<>(set); Collections.sort(sortedMenus); List<Menu> treeMenus = new ArrayList<>(); for (Menu menu : sortedMenus) { if (menu.getParentId() == 0) { treeMenus.add(menu); } else { for (Menu parentMenu : sortedMenus) { if (parentMenu.getId() == menu.getParentId()) { parentMenu.addChild(menu); break; } } } } for (Menu menu : treeMenus) { System.out.println(menu); } } } class Menu implements Comparable<Menu> { private int id; private String name; private int parentId; private List<Menu> children = new ArrayList<>(); public Menu(int id, String name, int parentId) { this.id = id; this.name = name; this.parentId = parentId; } public int getId() { return id; } public String getName() { return name; } public int getParentId() { return parentId; } public List<Menu> getChildren() { return children; } public void addChild(Menu menu) { children.add(menu); } @Override public int compareTo(Menu o) { return Integer.compare(id, o.id); } @Override public String toString() { return "Menu{" + "id=" + id + ", name='" + name + '\'' + ", parentId=" + parentId + ", children=" + children + '}'; } } ``` 这段代码可以根据 id、name、parentId 来构建树形菜单,其中 id 和 parentId 用于表示父子关系,name 用于表示菜单名称。在构建树形菜单时,首先需要去重,然后按照父子关系进行排序,最后使用递归算法构建树形菜单

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值