java--树封装

Multimap:允许key值相同,不会覆盖掉之前的数据。用于封装类似于Map<Object,List<Object>>这种有嵌套结构的数据。Maven坐标如下:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>10.0.1</version>
</dependency>

1.定义树结构

public class MyTree {
    private String id;
    private String parentId;
    private String name;
    private List<MyTree> child = Lists.newArrayList();
    //getter()、setter()方法。。。
   public void addChild(MyTree tree){ child.add(tree); }

2.支持多层次的树封装:  

//2万条数据封装耗时15ms
public Collection<MyTree> getCompleteTrees() {
        //获取数据
        List<MyTree> treeList = initList();
        //树节点封装
        Multimap<String, MyTree> multimap = treeNodePackageByParentId(treeList);
        //获取根节点
        Collection<MyTree> rootNodeList = multimap.get("0");
        //添加子节点
        addTreeNodeDependency(rootNodeList, multimap);
        return rootNodeList;
}
//按parentId聚合 private Multimap<String, MyTree> treeNodePackageByParentId(List<MyTree> treeList) { Multimap<String, MyTree> multimap = HashMultimap.create(); for (MyTree treeNode : treeList) { multimap.put(treeNode.getParentId(), treeNode); } return multimap; }
//添加依赖关系 private void addTreeNodeDependency(Collection<MyTree> rootTreeList, Multimap<String, MyTree> multiMap) { for (MyTree parentTreeNode : rootTreeList) { addChildNode(parentTreeNode, multiMap); } } private void addChildNode(MyTree parentTreeNode, Multimap<String, MyTree> multiMap) { String id = parentTreeNode.getId(); for (MyTree chileTreeNode : multiMap.get(id)) { String childId = chileTreeNode.getId(); parentTreeNode.addChild(chileTreeNode); if (multiMap.containsKey(childId)) { addChildNode(chileTreeNode, multiMap); } } }
//----------算法性能差,时间复杂度O(n*n),2万条数据封装耗时20s-------------
//获取数据
List<MyTree> treeList=initList(); MyTree resultTree=null;
//添加父节点和子节点依赖关系     
for(MyTree outTree:treeList){ String id=outTree.getId();
  //找到根节点
if("0".equals(outTree.getParentId())){ resultTree=outTree; } for(MyTree innerTree:treeList){ String parentId=innerTree.getParentId(); if(id.equals(parentId)){ outTree.addChild(innerTree); } }
}

3.数据结构如下:

idparentIdname
10中国
21江苏省
32南京市
42徐州市
54新沂市
61浙江省
76杭州市

 

 

 

 

 

 

 

 

4.运行结果如下:

 

转载于:https://www.cnblogs.com/jvStarBlog/p/10957886.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值