java list转tree实现树状菜单

有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID、名称与父节点ID,读出来的数据并不是前台想要的(当然现在好多tree库可以使用,不要拆台,最起码不好看是吧==),这个时候我们要想法处理一下都出来的list,将它变为一个树。

 比如直接查出来是左边的数据,我们要的效果是右边的数据

新建实体类:

public class SysDept {

    private Long id;

    private String name;
    
    private Long parentId;

    private Integer orderNum;

    private Byte delFlag;
    
    private List<SysDept> children;
    
    // 非数据库字段
    private String parentName;
    // 非数据库字段
    private Integer level;
    
	.....Getter/Setter

}

实现层:


	public List<SysDept> findTree() {
		List<SysDept> sysDepts = new ArrayList<>();
		List<SysDept> depts = sysDeptMapper.findAll();
		for (SysDept dept : depts) {
			if (dept.getParentId() == null || dept.getParentId() == 0) {
				dept.setLevel(0);
				sysDepts.add(dept);
			}
		}
		findChildren(sysDepts, depts);
		return sysDepts;
	}

	private void findChildren(List<SysDept> sysDepts, List<SysDept> depts) {
		for (SysDept sysDept : sysDepts) {
			List<SysDept> children = new ArrayList<>();
			for (SysDept dept : depts) {
				if (sysDept.getId() != null && sysDept.getId().equals(dept.getParentId())) {
					dept.setParentName(dept.getName());
					dept.setLevel(sysDept.getLevel() + 1);
					children.add(dept);
				}
			}
			sysDept.setChildren(children);
			findChildren(children, depts);
		}
	}

这边是用递归实现的,其他方法请参考:点击这里

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java可以通过使用递归和面向对象的思想来实现树形菜单。面是一个简单的示例: 首先,我们需要定义一个树类,该类包含节点的值和子节点列表: ```java class TreeNode { private String value; private List<TreeNode> children; public TreeNode(String value) { this.value = value; this.children = new ArrayList<>(); } public void addChild(TreeNode child) { children.add(child); } public List<TreeNode> getChildren { return children; } public String getValue() { return value } } ``` 然后,我们可以创建一个树形菜单类,该类包含根节点和一些操作方法: ```java class TreeMenu { private TreeNode root; public TreeMenu(TreeNode root) { this.root = root; } public void printMenu() { printNode(root, 0); } private void printNode(TreeNode node, int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append(" "); // 每一层缩进两个空格 } sb.append(node.getValue()); System.out.println(sb.toString()); List<TreeNode> children = node.getChildren(); for (TreeNode child : children) { printNode(child, level + 1); } } } ``` 最后,我们可以使用上述类来创建树形菜单并打印出来: ```java public class Main { public static void main(String[] args) { TreeNode root = new TreeNode("Root"); TreeNode node1 = new TreeNode("Node 1"); TreeNode node2 = new TreeNode("Node 2"); TreeNode node3 = new TreeNode("Node 3"); TreeNode node11 = new TreeNode("Node 1.1"); TreeNode node12 = new TreeNode("Node 1.2"); TreeNode node21 = new TreeNode("Node 2.1"); root.addChild(node1); root.addChild(node2); root.addChild(node3); node1.addChild(node11); node1.addChild(node12); node2.addChild(node21); TreeMenu treeMenu = new TreeMenu(root); treeMenu.printMenu(); } } ``` 运行上述代码,将会输出以下树形菜单: ``` Root Node 1 Node 1.1 Node 1.2 Node 2 Node 2.1 Node 3 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值