之前用的是每次递归接入数据库,从而生成树,现在是想一次取数,就生成树。
我开始用的是表格前后关系,发现比较慢,原因是有几次遍历,所以效率较差,但我发现,
如果把生成的数据直接运用的js,通过js构造树,好像也可以。
原来是通过这样构造的
0。interface TreeInterface //添加子叶
1。class TreeObject // 基类
2。class TreeLeaf extends TreeObject // 叶子
3。class TreeNode extends TreeObject implements TreeInterface // 枝支
4。class Tree implements TreeInterface //树干
通过递归构造这棵树,这也要求表有严格的层次关系。
通过研究表的嵌套,我发现可以利用sql语句生成的结果直接构造出树来,用connect by prior id = parent_id,这个子句,生成的是类似于
level | 1 | 2 | 3 | 4 | 5 |
1 | |||||
2 | |||||
4 | |||||
3 | |||||
5 |
每一横向就是树型菜单的一个节点,无论是叶子还是树枝,
下面是某个实际生成树
前后关系我用了一个函数来操作
public void testLayer(int i){
int tempP = 0;
int tempC = 0;
int tempN = 0;
TreeBox tempTB1,tempTB2,tempTB3 ;
tempTB1 = (TreeBox)scountHM.get(String.valueOf(i-1));
if(tempTB1!=null){//如果不为第一节点 则直接取值,否则用默认的 0
tempP = tempTB1.getLevel();
}else{
tempP= 0;
}
tempTB2 = (TreeBox)scountHM.get(String.valueOf(i));
tempC = tempTB2.getLevel();
tempTB3 = (TreeBox)scountHM.get(String.valueOf(i+1));
if(tempTB3!=null){
tempN = tempTB3.getLevel();
}else{
tempN= 0;
} //向下不可能出现断层
//向上可能出现断层,所以要考虑断层次数从而 封闭表格
r_above = tempP-tempC;//可能结果为0(同层) >0(高层) -1(下一级)
r_down = tempC-tempN;//可能结果为0 n>0(结束多层) -1(下一级)
}
int tempP = 0;
int tempC = 0;
int tempN = 0;
TreeBox tempTB1,tempTB2,tempTB3 ;
tempTB1 = (TreeBox)scountHM.get(String.valueOf(i-1));
if(tempTB1!=null){//如果不为第一节点 则直接取值,否则用默认的 0
tempP = tempTB1.getLevel();
}else{
tempP= 0;
}
tempTB2 = (TreeBox)scountHM.get(String.valueOf(i));
tempC = tempTB2.getLevel();
tempTB3 = (TreeBox)scountHM.get(String.valueOf(i+1));
if(tempTB3!=null){
tempN = tempTB3.getLevel();
}else{
tempN= 0;
} //向下不可能出现断层
//向上可能出现断层,所以要考虑断层次数从而 封闭表格
r_above = tempP-tempC;//可能结果为0(同层) >0(高层) -1(下一级)
r_down = tempC-tempN;//可能结果为0 n>0(结束多层) -1(下一级)
}
再写。