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;
    }

你可能感兴趣的:(springboot学习,java,开发语言)