平铺数据结构转成树状数据(双循环版)

平铺数据结构转成树状数据的方式有很多,本文采用,双循环实现,用1.8的新特性流会比较优雅,也很容易懂。

package com.ruoyi.web.controller.common;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

/**
 * 〈〉<br>
 *
 * @author 
 * @Description
 * @date 2023/1/10 21:05
 */
@Data
@Getter
@Setter
public class test {

	int id;
	int pid;
	List<test> Children;

	/**
	 * java1.8 非递归实现平铺数据转成Tree型结构  类似于双循环实现。是吧地址塞进去了
	 */
	static final Function<List<test>,List<test>> MULTI_TREE_CONVERTER = sources->
			sources.stream()
					.filter(item->{
						item.setChildren(
								sources.stream()
										.filter(e-> Objects.equals(e.getPid(), item.getId()))
										.collect(Collectors.toList()));
						return item.getPid() == 0;})
					.collect(Collectors.toList());
	public static void main(String[] args) {
	List<test> list =new ArrayList<test>();
		test test = new test();
		test.setId(1);
		test.setPid(0);
		test t = new test();
		t.setId(2);
		t.setPid(1);
		test t1 = new test();
		t1.setId(3);
		t1.setPid(1);
		test t2 = new test();
		t2.setId(4);
		t2.setPid(2);
		list.add(test);
		list.add(t);
		list.add(t1);
		list.add(t2);
		List<com.ruoyi.web.controller.common.test> tests = buildTreeBy2Loop(list, 0);
		System.out.println(tests);
		System.out.println("-------------");
		for (com.ruoyi.web.controller.common.test test1 : MULTI_TREE_CONVERTER.apply(list)) {
			System.out.println(test1);
		}



	}
	/**
	 * 利用双循环方式构造树  
	 * @param treeNodes 所有树节点
	 * @param root 树的根节点引用
	 * @return List<BaseTreeNode> 返回构造好的树
	 */
	public static List<test> buildTreeBy2Loop(List<test> treeNodes, int root) {
		List<test> trees = new ArrayList<>();
		//判断当前节点是否是root的子节点,如果是就存入list
		for (test node : treeNodes) {
			if (root==(node.getPid())) {
				trees.add(node);
			}
			//再判断当前节点是否是其他节点的父节点,如果是就把子节点保存
			for (test treeNode : treeNodes) {
				if (node.getId()==treeNode.getPid()) {
					if (node.getChildren()==null) {
						node.setChildren(new ArrayList<>());
					}
					node.getChildren().add(treeNode);
				}
			}
		}
		return trees;
	}
}

代码完美运行,本文阐述双循环实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值