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