不用递归实现无限级下拉树高效算法【原创】

系统 1749 0

在公司项目中用递归生成 Tree 时,出现了很严重的性能问题,在google 中 go 很久,也没有找到不用递归实现无限级 Tree 的算法。后来,抱着尝试的心理。结果,我用两个循环就搞定了。自认为这个算法应该很高效,以后递归树的地方我就用这个算法了。不过,需要注意的是,你的数据必须是根据ID从小到大排过序的。否则,就会显示不正确。如果数据无序,建议你先排序然后才调用此算法。看来,我还是相当聪明的嘛,嘿嘿

以下是代码:

public static void main(String[] args)
 {
  /*------------- 树形结构测试数据 START CODE --------------*/
  List<Object[]> list = new ArrayList<Object[]>();
  
  list.add(new Object[]{"AA1",999,0});
  list.add(new Object[]{"AA1_AA2",11,999});
  list.add(new Object[]{"AA1_AA1",10,999});
  list.add(new Object[]{"AA1_AA1_AA2",1001,10});
  list.add(new Object[]{"AA1_AA1_AA1",100,10});
  list.add(new Object[]{"AA1_AA1_AA2_AA1",100101,1001});
  list.add(new Object[]{"AA1_AA1_AA2_AA2",100102,1001});
  list.add(new Object[]{"BB1",2,0});
  list.add(new Object[]{"BB1_BB1",20,2});
  list.add(new Object[]{"BB1_BB1_BB1",200,20});
  list.add(new Object[]{"BB1_BB1_BB2",201,20});
  
  /*------------- 树形结构测试数据 START END --------------*/
  
  StringBuffer sb = new StringBuffer();
  //存放符合条件的所有 节点ID
  List<Integer> aList = new ArrayList<Integer>();
  aList.add(999); //测试查找以 3 作为父节点的所有 子节点列表
  //存放在内部循环中所有找到的以指定ID作为父节点的子ID。
  List<Integer> tempList = new ArrayList<Integer>();
  
  for(int i=0,count=list.size();i<count; i++){
   Object[] arr = list.get(i);
   String name = arr[0].toString();
   int id = Integer.parseInt(arr[1].toString());
   int pid = Integer.parseInt(arr[2].toString());
   for(int j=0,len=aList.size(); j<len; j++){
    int currid = aList.get(j);
    if(id==currid || pid==currid){ //如果数据中 ID或 PID与指定 currid 相同
     sb.append(name+"\n");
     tempList.add(id); //保存子节点ID到 tempList
    }
    //如果找到最后一个,并且 tempList 中有子节点的话,把 tempList 赋给 aList
    if(j==(len-1) && tempList.size()>0){ 
     aList = tempList;
    }
   }
  }
  //打印所有以 3 作为父节点的所有 子节点
  System.out.println(sb.toString());
 }

 

执行结果如下:

AA1
AA1_AA2
AA1_AA1
AA1_AA1_AA2
AA1_AA1_AA1
AA1_AA1_AA2_AA1

不用递归实现无限级下拉树高效算法【原创】


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论