java 和 js非递归成树

3 篇文章 0 订阅

测试类

	public class A{
			private Integer id;
			private Integer parantId;
			private String name;
			private List<A> children=new ArrayList<A>();
			
			public List<A> getChildren() {
				return children;
			}
			public void setChildren(List<A> children) {
				this.children = children;
			}
			public Integer getId() {
				return id;
			}
			public void setId(Integer id) {
				this.id = id;
			}
			
			public Integer getParantId() {
				return parantId;
			}
			public void setParantId(Integer parantId) {
				this.parantId = parantId;
			}
			public String getName() {
				return name;
			}
			public void setName(String name) {
				this.name = name;
			}
			
		}

public class TreeUtil {
		public static <T,M> List<T> toTree(List<T> data,TreeGetList<T> callList,
			TreeGetCode<M,T> code,TreeGetCode<M,T> pcode
			){
			Map<M,T> groupData=new HashMap<M,T>();
			for(T t:data) {
				groupData.put(code.getCode(t), t);
			}
			data.forEach(m->{
	    		M paran=pcode.getCode(m); 
	    		if(paran!=null&&groupData.containsKey(paran)) {
	    			List<T>  d= callList.getList(groupData.get(paran));
	    			d.add(m);
	    		}
	    	});
			for(int j=data.size()-1;j>=0;j--) {
	    		M paran= pcode.getCode(data.get(j));
	    		if(!(paran==null||!groupData.containsKey(paran))) {
	    			data.remove(j);
	    		}
	    	} 
			return data;
	} 
	public interface TreeGetList<T>{
		public  List<T> getList(T t);
	}
	public interface TreeGetCode<T,M>{
		public  T getCode(M m);
	}
}

最后main 调用测试

	 public static void main(String ...args) {
	    	A o=new A();
	    	o.setId(1);
	    	A o1=new A();
	    	o1.setId(2);
	    	o1.setParantId(1);
	    	List<A> data=new ArrayList<A>();
	    	data.add(o);
	    	data.add(o1); 
	     	A o3=new A();
	    	o3.setId(55);
	    	o3.setParantId(1);
	    	data.add(o3);
	    	data= 
	    	TreeUtil.toTree(
	    			data, 	//数据源
	    			m->m.getChildren()	//获取子节点列表
	    			,  m->m.getId() 		//获取id
	    			,m->m.getParantId()		//获取父节点id
	    			);
	    	System.out.println(JSONObject.toJSONString(data));
	   }
	var toTree=function(data,id,pid,childName){
			var pdata={};
			for(var i=0;i<data.length;i++){ 
                 var key=data[i][pid]; 
                 if(!pdata[key]){ 
                    pdata[key]=[]; 
                 }  
                pdata[key].push(data[i]); 
              } 
              //构建下级关系 
             for(var i=0;i<data.length;i++){ 
                 if(pdata[data[i][id]]){ 
                    data[i][childName]=pdata[data[i][id]]; 
                    for(var q=0;q<data[i][childName].length;q++){  
                      data[i][childName][q].delete=true; 
                    } 
                 } 
             }  
              for(var i=data.length-1;i>=0;i--){ 
                 if(data[i].delete){   //删除节点数据 
                 	delete data[i].delete;
                    data.splice(i,1); 
                 } 
             }
            return data;
			
	}

测试代码

	toTree([{id:1,pid:null},{id:2,pid:1},{id:3,pid:2}],"id","pid","list")

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将List数据转换成树形结构的基本思路是首先遍历List,将其中每个节点的父子关系建立起来,然后从根节点开始递归构建整个树形结构。 具体实现步骤如下: 1. 定义节点类,包含节点id、节点名称和子节点列表等属性。 ``` public class TreeNode { private String id; private String name; private List<TreeNode> children; // getter和setter方法 // ... } ``` 2. 遍历List,将每个节点的父子关系建立起来,可以使用Map来存储节点id和对应的节点对象,便于查找父节点。 ``` Map<String, TreeNode> map = new HashMap<>(); for (TreeNode node : list) { map.put(node.getId(), node); String parentId = node.getParentId(); if (parentId != null) { TreeNode parent = map.get(parentId); if (parent != null) { parent.getChildren().add(node); } } } ``` 3. 找到根节点,开始递归构建整个树形结构。 ``` public static TreeNode buildTree(List<TreeNode> list) { // 构建Map,方便查找节点 Map<String, TreeNode> map = new HashMap<>(); for (TreeNode node : list) { map.put(node.getId(), node); } // 找到根节点 TreeNode root = null; for (TreeNode node : list) { if (node.getParentId() == null) { root = node; break; } } // 从根节点开始递归构建整个树形结构 buildSubTree(root, map); return root; } private static void buildSubTree(TreeNode node, Map<String, TreeNode> map) { List<TreeNode> children = node.getChildren(); if (children == null) { return; } // 遍历子节点,递归构建子树 for (TreeNode child : children) { buildSubTree(child, map); } // 根据子节点的顺序重新排序 children.sort(Comparator.comparing(TreeNode::getName)); } ``` 以上就是将List数据转换成树行结构的基本实现方法。需要注意的是,这里的代码只是一个简单的示例,实际情况下可能需要根据具体的业务需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值