同事设计了一个数据库表,就是实现树状结构的典型表结构
字段有 id,name,code,parentCode
为了只用一条sql语句就可以遍历出整个树,同事增加了一个字段 treeCode所以数据表看起来就是这样的
我根据这个表的treeCode用delphi 的AdoQuery通过递归生成了树结构,代码很简单。然后想用java也实现同样的效果,小费了一些功夫,代码看起来也不够简洁。本想用iterator实现了,尝试了很多种办法都不行,最后还是妥协了用list 和 全局index 实现的,树用xml展现的。这里用的dom4j。现在把代码先贴出来,以便以后改进算法。
生成的xml如下
感觉肯定有更简单的办法实现这个递归,可惜对java语言的理解还是太肤浅,期待日后改进
字段有 id,name,code,parentCode
为了只用一条sql语句就可以遍历出整个树,同事增加了一个字段 treeCode所以数据表看起来就是这样的
id name code parentCode treeCode
1 sind 01 0 01
2 sind01 02 01 0101
3 sind02 03 01 0102
4 aj 04 0 02
5 aj01 05 02 0201
我根据这个表的treeCode用delphi 的AdoQuery通过递归生成了树结构,代码很简单。然后想用java也实现同样的效果,小费了一些功夫,代码看起来也不够简洁。本想用iterator实现了,尝试了很多种办法都不行,最后还是妥协了用list 和 全局index 实现的,树用xml展现的。这里用的dom4j。现在把代码先贴出来,以便以后改进算法。
class XmlCreator {
private Integer userIndex;
private void FillTheList(List<User> users){
User user = new User();
user.setName("sind");
user.setCode("01");
user.setId(1);
users.add(user);
user = new User();
user.setName("sind01");
user.setCode("0101");
user.setId(2);
users.add(user);
user = new User();
user.setName("sind02");
user.setCode("0102");
user.setId(3);
users.add(user);
user = new User();
user.setName("vicky");
user.setCode("02");
user.setId(4);
users.add(user);
user = new User();
user.setName("vicky01");
user.setCode("0201");
user.setId(5);
users.add(user);
}
public void CreateXmlMain(){
List<User> users = new ArrayList<User>();
FillTheList(users);
this.userIndex = 0;
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding("GBK");
Element root = doc.addElement("tree");
CreateXmlNode(users,root);
System.out.print(doc.asXML());
}
public void CreateXmlNode(List<User> list,Element el){
//获取循环前 当前Code长度
int codeLength = list.get(userIndex).getCode().length();
while (userIndex<list.size()){
User user = list.get(userIndex);
//判断如果Code长度与上一个相同则循环添加节点,否则跳出循环 ...如果没有这个判断,会导致循环无法及时跳出,递归出错
if (codeLength == user.getCode().length()){
//添加节点
Element sel = el.addElement("item");
sel.addAttribute("name", user.getName());
codeLength = user.getCode().length();
//索引递增1
userIndex++;
//判断下一个Code长度是否大于当前长度,如果是则递归
if (userIndex<list.size()&&list.get(userIndex).getCode().length()>codeLength){
CreateXmlNode(list,sel);
}
}else break;
}
}
}
生成的xml如下
<?xml version="1.0" encoding="GBK" ?>
<tree>
<item name="sind">
<item name="sind01" />
<item name="sind02" />
</item>
<item name="vicky">
<item name="vicky01" />
</item>
</tree>
感觉肯定有更简单的办法实现这个递归,可惜对java语言的理解还是太肤浅,期待日后改进