java--list转树形结构

java–list转树形结构

1. 双重循环

2. 递归

3. Stream()

1. 双重循环

	@Override
	public List<Address> getAddressTree1() {
		// 获取数据库中的所有address数据
		List<Address> list = this.baseMapper.getAddressTree();
		// 返回的树形数据
		List<Address> tree = new ArrayList<Address>();
		// 第一次遍历
		for (Address address : list) {
			// 找到根节点,这里我的根节点的pid为0
			if (address.getPid().equals("0")) {
				tree.add(address);
			}
			// 定义list用于存储子节点
			List<Address> children = new ArrayList<Address>();
			// 再次遍历list,找到子节点
			for (Address node : list) {
				// 子节点的pid等于父节点的id
				if (node.getPid().equals(address.getId())) {
					children.add(node);
				}
			}
			// 给父节点设置子节点
			address.setChildren(children);
		}
		return tree;
	}

2. 递归

	@Override
    public List<Address> getAddressTree2() {
        // 获取数据库中的所有address数据
        List<Address> list = this.baseMapper.getAddressTree();
        // 返回的树形数据
        List<Address> tree = new ArrayList<Address>();
        // 第一次遍历
        for (Address address : list) {
            // 找到根节点,这里我的根节点的pid为0
            if (address.getPid().equals("0")) {
                tree.add(findChild(address, list));
            }
        }
        return tree;
    }

    private Address findChild(Address address, List<Address> list) {
        // 定义list用于存储子节点
        List<Address> children = new ArrayList<Address>();
        for (Address node : list) {
            // 找到根节点,这里我的根节点的pid为0
            if (node.getPid().equals(address.getId())) {
                // 调用递归
                children.add(findChild(node, list));
            }
        }
        address.setChildren(children);
        return address;
    }

3. Stream()

	@Override
    public List<Address> getAddressTree() {
        // 获取数据库中的所有address数据
        List<Address> addresses = this.baseMapper.getAddressTree();
        // 操作所有的address数据
        // 通过Collectors.groupingBy(Address::getPid)方法对addresses按照Pid进行分组,也就是将pid相同的放在一起
        Map<String, List<Address>> addressMap = addresses.stream().collect(Collectors.groupingBy(Address::getPid));
        // 循环addresses,给它设置children属性
        addresses.forEach(address -> {
            address.setChildren(addressMap.get(address.getId()));
        });
        // 现在已经形成了多棵树,最后我们再通过filter()方法挑选出根节点的那颗树即可。 这里我的根节点的pid为0
        List<Address> resultList = addresses.stream().filter(item -> item.getPid().equals("0"))
                .collect(Collectors.toList());
        return resultList;
    }
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值