求JAVA实现添加无限级分类

如下面的:
无限级添加子目录;
水果
|_夏天的水果
|_苹果
|_黄苹果
|_冬天的水果
|_梨子
衣服
|_夏天的衣服
|_短袖
|_冬天的衣服
|_长袖
这个就是那种新闻管理系统,然后添加分类,分类是可由用户无限自定义添加的,求方案,我现在设计了的表是这样的

id 主键 int
isParent bit 是否为根目录
parentid int 父类ID
listname varchar(50) 栏目名称

希望显示的效果是这样的:
水果
|_夏天的水果
|_苹果
|_黄苹果
|_冬天的水果
|_梨子
衣服
|_夏天的衣服
|_短袖
|_冬天的衣服
|_长袖
如果字段不够,可以添加,谢谢了

public void bind(List list){
Classify classify=null;

for(int i=0;i<lst.size();i++){
classify=(Classify)lst.get(i);
if(classify.getisParent()){//判断目录是否为根目录
list=new ArrayList();
out.println(classify.getListname()+"/n");
list.add(classify.getId());
}else{
for(int j=0;j<alist.size();j++){
if(Integer.parseInt(alist.get(j).toString())==classify.getParentid()){
list=new ArrayList();
list.add(classify.getId());
out.println(classify.getListname());
bind(list);
}
}
}

}
}

这是我自己之前这样想的,本以为用递归可以搞定,没想到好的方法,后来打算用层的意思来,就是,添加一个字段,放层,因为ID都是主键,所以他是唯一的, 父类ID 加上子类的ID作为一个层来做,也暂时不知道怎么实现,求高手解决。
[b]问题补充:[/b]
首先谢谢“墓里活人”这位朋友,我的要求是一次性全部显示出来,而不是单击一下然后展示下一级。
[b]问题补充:[/b]
是一次性读出来
[b]问题补充:[/b]
是采用hibernate来做的
[b]问题补充:[/b]
墓里活人 问题是怎么打印出来
[b]问题补充:[/b]
墓里活人 你的代码跑起来是死循环啊,能给我详细代码不,谢谢了,我的QQ邮箱:83439123@qq.com 谢谢了

输出死循环
还是读取死循环

大概思路就是这样,你自己调试 改改就行了

如果是输出死循环
那大概是这句有问题:
//递归链结束条件

if( !(list!=null&&list.size()>0) )return;

以下表结构
水果ID 父类水果ID XXX XXX XXX

如果父类水果ID为空 则是最顶级水果种类

查找下一级 只须 用本级的 主键ID (where ID = 父类ID) 就能找出下一级

你是想要 一次性读取的代码 是吗?

你是用的 jdbc 还是 hibernate

把问题回答了 我给你写个 递归全部解析 出来 放到容器里

树的实现,理论上来说,是可以达到无限级的,但是考虑性能和其他的原因,可以会比较难以实现,我们在树的实现上,是通过动态查询的方式,一级一级的出,否则,数据量大的话,再好的查询,再好的算法也得挂掉,需要一个parentid,和一个childnum,父节点id,一个子节点个数,需要维护这两个参数,你的树就会很强壮

水果-
--冬天的水果
------雪梨

数据库
id int
parentid int
name varchar(20)

entity类

public class Fruit{
private int id;

}

上面那个失误,没看到按个提交上去了

这里是POJO
public class Fruit{
private int id;
private int parentid ;
private Set childs = new HashSet ();
//get..set 方法省略
}

//配置文件我就不写了

如果需要全部查询出来的话,写个深度递归

public List QueryAll()
{
//下来个查询所有 ,这里可以判断下,查询出来的是否为子节点
//查询条件可以以下面是否还有子节点来判断,如果不是,则可以调用自己继续继续查
}

我晕了,上面那个pojo 写错了,parentid 不需要写出来,漏了个name 属性没写,我写反了

你的pojo稍微改一下
public class Fruit{
private int id;
private int parentid ;
private List childs = new ArrayList ();
//get..set 方法省略
}

[code="java"]
//parentid 规定为0时 则表示你想从树根开始往下读取
//如果从树根往下读 则list 只有包含一个树根的pojo
//其余的在这个 树根POJO 的getChilds()方法下面
//getChilds()方法 是获得属于这个父节点的所有子节点
public List public findChildren(Session session,int parentid ){

String hql = "from Fruit.o where o.parentid = "+parentid +"";
Query query = session.createQuery(hql);
List list = query.list();
for(Iterator ite = list.iterator();ite.hasNext(); ){
  Fruit fruit = (Fruit)ite.next();
  fruit.setChilds( 
      findChildren( session,fruit.getParentid() ) 
  );
}
return list;

}
[/code]

补充打印代码:

[code="java"]

public void printResult(List list,int blankCount){

   //递归链结束条件
   if( !(list!=null&&list.size()>0) )return;

   int format = blankCount;//控制台输出 格式控制
   for(int i=0;i<list.size();i++){
      Fruit fruit = (Fruit)list.get(i);
      //空格输出(格式控制)
      while( (format--)>0 )System.out.print(" "); 
      System.out.println( fruit.getName()  );
      //递归打印
      printResult( fruit.getChilds(),blankCount+3 );
   }

}
/*ps: 这里只是 演示打印打印代码怎么写
前台你根据这个思想 你自己调整
另 :这段代码没调试过。
*/
[/code]