将List数据快速转换为Tree 树结构
看了现在很多网友写的,发现他们写的代码逻辑都会对数据进行多次循环,这样性能我个人认为不是很好,所以我这边贴出我的代码,这边只用到一次循环,供大家参考,和一起学习,希望大家一起提出更好的想法。
/**
树结构实体 大部分基本上都是这样 需要的自行改造
*/
public class Node {
public Node(String id, String pId, String string) {
this.id = id;
pid = pId;
name = string;
this.children = new ArrayList<Node>();
}
/**
* id
*/
private String id;
/**
* 父节点id
*/
private String pid;
/**
* 名称
*/
private String name;
/**
* 子节点
*/
private List<Node> children;
}
下面我们来展示真正转换的逻辑代码代码
public List<Node> buildTree(List<Node> nodes){
Map<String, Node> nodeMap = new HashMap<String, BuildTree.Node>();
List<Node> roots = new ArrayList<Node>();
for (Node node : nodes) {
String id = node.getId();
Node n = nodeMap.get(id);
if(n == null){
n = node;
nodeMap.put(id, node);
}else {
String pid = n.getPid();
if(pid.equals("-1")){//代表是我们预先存的节点 替换真实数据
copyProps(n,node);//复制数据逻辑
}
}
String pid = node.getPid();
Node pn = nodeMap.get(pid);
if(pn == null){//父节点不存在 先设置假数据 存在
pn = new Node(pid, "-1", "");
if(pid.equals("0")){
roots.add(pn);
}
nodeMap.put(pid, pn);
}
pn.children.add(n);
}
return roots.get(0).getChildren();//返回真正顶级节点
}
微信扫描关注公众号【搜易开源】,来领取学习大礼包!!!
微信扫描关注公众号【搜易开源】,来领取学习大礼包!!!
微信扫描关注公众号【搜易开源】,来领取学习大礼包!!!
微信扫描关注公众号【搜易开源】,来领取学习大礼包!!!