展开树状记录的程序很多是采用递归算法。我們知道,递归的方法逻辑比较简单,实际操作起来比较容易。但是递归有一个最大的缺点就是占用资源太多,速度太慢。如果在互联网的"论坛"上采用此种方法,在表记录很多的情况下将是一个非常严重的问题。我们可以用堆栈来解决递归效率低下占用资源的问题。
一、表结构(article)
tpId int 本记录ID号
tpPid int 父记录ID号
title varchar 贴子标题
author varchar 贴子作者
datetime date 发贴日期时间
isLeaf int 是否叶子(没有子贴)
..... 根据具体的情况我们还可以有更多的字段
二、操作方法
(1) 首先,我们读出所有父结点为"0"的记录也就是"主贴",统统放入堆栈中。
(2) 然后,输出位于栈顶的一条记录("主贴")数据,并清空栈顶,栈頂下移一格。
(3) 接着,查找所有父结点为该栈项结点("主贴")的记录("回贴"),也统统放于栈顶。
注意到没有,就这两步我们就完成了把一条父记录输出并展开其子结点的工作。余下的工作只是依次类推而已了,直到栈为空为止。
三 代码简要整理.
/** 速度很快的堆栈显示帖子*/
public void stackShow(String id) {
/** 堆栈*/
StackUtil s = new StackUtil(1000);
/** 读出所有父结点为"0"的记录也就是"主贴",统统放入堆栈中*/
String pageHql = HqlUtil.getHql("Topic", "tpPid", id);
List l = topicDAO.getRecordsByHql(pageHql, id, null);
System.out.println("l.size=" + l.size());
for (int i = 0; i < l.size(); i++) {
Topic t = (Topic) l.get(i);
System.out.println("id=" + t.getTpId());
s.push(t);
}
/** 输出栈顶元素直到栈为空*/
while (!s.isEmpty()) {
/** 输出位于栈顶的一条记录("主贴")数据,并清空栈顶,栈頂下移一格*/
Topic t = s.Pop();
System.out.println("top=" + s.getTop());
System.out.println("id=" + t.getTpId());
/** 查找所有父结点为该栈项结点("主贴")的记录("回贴"),也统统放于栈顶*/
String pageHql2 = HqlUtil.getHql("Topic", "tpPid", t.getTpId());
List l2 = topicDAO.getRecordsByHql(pageHql, t.getTpId(), null);
Iterator iter = l2.iterator();
while (iter.hasNext()) {
Topic t2 = (Topic) iter.next();
s.push(t2);
}
}
}
一、表结构(article)
tpId int 本记录ID号
tpPid int 父记录ID号
title varchar 贴子标题
author varchar 贴子作者
datetime date 发贴日期时间
isLeaf int 是否叶子(没有子贴)
..... 根据具体的情况我们还可以有更多的字段
二、操作方法
(1) 首先,我们读出所有父结点为"0"的记录也就是"主贴",统统放入堆栈中。
(2) 然后,输出位于栈顶的一条记录("主贴")数据,并清空栈顶,栈頂下移一格。
(3) 接着,查找所有父结点为该栈项结点("主贴")的记录("回贴"),也统统放于栈顶。
注意到没有,就这两步我们就完成了把一条父记录输出并展开其子结点的工作。余下的工作只是依次类推而已了,直到栈为空为止。
三 代码简要整理.
/** 速度很快的堆栈显示帖子*/
public void stackShow(String id) {
/** 堆栈*/
StackUtil s = new StackUtil(1000);
/** 读出所有父结点为"0"的记录也就是"主贴",统统放入堆栈中*/
String pageHql = HqlUtil.getHql("Topic", "tpPid", id);
List l = topicDAO.getRecordsByHql(pageHql, id, null);
System.out.println("l.size=" + l.size());
for (int i = 0; i < l.size(); i++) {
Topic t = (Topic) l.get(i);
System.out.println("id=" + t.getTpId());
s.push(t);
}
/** 输出栈顶元素直到栈为空*/
while (!s.isEmpty()) {
/** 输出位于栈顶的一条记录("主贴")数据,并清空栈顶,栈頂下移一格*/
Topic t = s.Pop();
System.out.println("top=" + s.getTop());
System.out.println("id=" + t.getTpId());
/** 查找所有父结点为该栈项结点("主贴")的记录("回贴"),也统统放于栈顶*/
String pageHql2 = HqlUtil.getHql("Topic", "tpPid", t.getTpId());
List l2 = topicDAO.getRecordsByHql(pageHql, t.getTpId(), null);
Iterator iter = l2.iterator();
while (iter.hasNext()) {
Topic t2 = (Topic) iter.next();
s.push(t2);
}
}
}