`

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

阅读更多

在公司项目中用递归生成 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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics