List转为Tree的方法

package com.xicheng.test;

import java.util.List;

/**
 * 2018年3月26日上午7:32:37
 * 树节点实体类
 */
public class TreeNode {
	private String id;
	private String parentId;
	private String name;
	private List<TreeNode> children;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getParentId() {
		return parentId;
	}
	public void setParentId(String parentId) {
		this.parentId = parentId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List<TreeNode> getChildren() {
		return children;
	}
	public void setChildren(List<TreeNode> children) {
		this.children = children;
	}
	@Override
	public String toString() {
		return "TreeNode [id=" + id + ", parentId=" + parentId + ", name=" + name + ", children=" + children + "]";
	}
	public TreeNode() {
	}
	public TreeNode(String id, String name, String parentId) {
		this.id = id;
		this.parentId = parentId;
		this.name = name;
	}
}

package com.xicheng.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class List2Tree {
	public static void main(String[] args) {
		TreeNode t1 = new TreeNode("1","p1","0");
		TreeNode t2 = new TreeNode("2","p2","0");
		TreeNode t3 = new TreeNode("3","s11","1");
		TreeNode t4 = new TreeNode("4","s12","1");
		TreeNode t5 = new TreeNode("5","s21","2");
		TreeNode t6 = new TreeNode("6","s22","2");
		TreeNode t7 = new TreeNode("7","s23","2");
		
		List<TreeNode> treeList = new ArrayList<>();
		Collections.addAll(treeList, t1,t2,t3,t4,t5,t6,t7);
		
		
		System.out.println(toTree01(treeList));
		System.out.println(toTree02(treeList));
	}
	
	/**
	 * 方式一:使用两层循环实现
	 * @param list
	 * @return
	 */
	public static List<TreeNode> toTree01(List<TreeNode> treeList) {
		List<TreeNode> retList = new ArrayList<>();
		
		for (TreeNode parent : treeList) {
			if ("0".equals(parent.getParentId())) {
				retList.add(parent);
			}
			
			for (TreeNode child : treeList) {
				if (child.getParentId() == parent.getId()) {
					if (parent.getChildren() == null) {
						parent.setChildren(new ArrayList<>());
					}
					parent.getChildren().add(child);
				}
			}
		}
		return retList;
	}
	
	/**
	 * 方式二:使用递归实现
	 * @param treeList
	 * @return
	 */
	public static List<TreeNode> toTree02(List<TreeNode> treeList) {
		List<TreeNode> retList = new ArrayList<>();
		for (TreeNode parent : treeList) {
			if ("0".equals(parent.getParentId())) {
				retList.add(findChildren(parent, treeList));
			}
		}
		return retList;
	}

	private static TreeNode findChildren(TreeNode parent, List<TreeNode> treeList) {
		for (TreeNode child : treeList) {
			if (parent.getId().equals(child.getParentId())) {
				if (parent.getChildren() == null) {
					parent.setChildren(new ArrayList<>());
				}
				parent.getChildren().add(findChildren(child, treeList));
			}
		}
		return parent;
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的List转为多个树的过程可以通过以下方法来实现: 1. 首先,我们需要定义一个树节点的类,包含节点的值以及子节点列表,例如: ``` public class TreeNode { private int value; private List<TreeNode> children; public TreeNode(int value) { this.value = value; children = new ArrayList<>(); } // getter和setter方法 } ``` 2. 接下来,我们需要编写一个方法来将List转为多个树,例如: ``` public List<TreeNode> convertListToTrees(List<Integer> list) { List<TreeNode> trees = new ArrayList<>(); Map<Integer, TreeNode> nodeMap = new HashMap<>(); // 先创建树节点并将其放入映射表中 for (Integer value : list) { TreeNode node = new TreeNode(value); nodeMap.put(value, node); } // 构建树结构 for (Integer value : list) { TreeNode node = nodeMap.get(value); // 如果当前节点有父节点,则将其添加到父节点的子节点列表中 if (nodeMap.containsKey(value - 1)) { TreeNode parent = nodeMap.get(value - 1); parent.getChildren().add(node); } else { // 否则,当前节点为根节点,直接添加到多个树列表中 trees.add(node); } } return trees; } ``` 3. 最后,我们可以通过调用上述方法来将List转为多个树,例如: ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); List<TreeNode> trees = convertListToTrees(list); // 遍历多个树,并输出每个树的结构 for (TreeNode tree : trees) { printTree(tree); } ``` 注意:上述方法假设输入的List中的节点值是连续的整数,并且根节点的值为1,父节点的值比其子节点小1,子节点的值比其父节点大1。如果输入的List不满足这些条件,则需要进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值