参考
http://www.csdn.net/develop/read_article.asp?id=17732

解决方案 »

  1.   

    // $Id: MenuTree.java,v 1.10 2000/02/02 15:18:35 gongke Exp $
    package peiyang.priv;import util.db.DB;
    import sun.jdbc.rowset.CachedRowSet;
    import util.string.StringUtil;
    import java.util.ArrayList;public class MenuTree {
      public ArrayList tree = new ArrayList();
      public ArrayList cach = new ArrayList();
      private DB mydb = new DB();
      /**
       * 取得子菜单数据集(递归调用)
       */
      public void getChildMenu(int fatherId) throws java.sql.
          SQLException {
        CachedRowSet rs = new CachedRowSet();
          for (int i=0;i<cach.size();i++){
            Menu menuItems=(Menu)cach.get(i);
            if (menuItems.getFatherId()==fatherId){
              Menu menuItem = new Menu();
              menuItem.setMenuId(menuItems.getMenuId());
              menuItem.setMenuName(menuItems.getMenuName());
              menuItem.setMenuLevel(menuItems.getMenuLevel());
              menuItem.setMenuUrl(menuItems.getMenuUrl());
              menuItem.setFatherId(menuItems.getFatherId());
              tree.add(menuItem);
              getChildMenu(menuItem.getMenuId());
            }
          }  }
      public void getUserMenu(int fatherId, String userId) throws java.sql.
          SQLException {
        try {
          for (int i=0;i<cach.size();i++){
            Menu menuItems=(Menu)cach.get(i);
            if (menuItems.getFatherId()==fatherId){
              Menu menuItem = new Menu();
              menuItem.setMenuId(menuItems.getMenuId());
              menuItem.setMenuName(menuItems.getMenuName());
              menuItem.setMenuLevel(menuItems.getMenuLevel());
              menuItem.setMenuUrl(menuItems.getMenuUrl());
              menuItem.setFatherId(menuItems.getFatherId());
              tree.add(menuItem);
              getUserMenu(menuItem.getMenuId(), userId);
            }
          }
        }
        catch (Exception e) {
          System.out.println("getUserMenu1"+e.getMessage());
        }
      }  public void initial(String userId) {
        CachedRowSet rs = null;
        try {
          String sql = "select * from v_Menu where userId='" + userId
              + "' order by menuOrder";
          //System.out.println(sql);
          rs = mydb.executeQuery(sql);
          while (rs.next()) {
            Menu menuItem = new Menu();
            menuItem.setMenuId(rs.getInt("menuId"));
            menuItem.setMenuName(rs.getString("menuName"));
            menuItem.setMenuLevel(rs.getInt("menuLevel"));
            menuItem.setFatherId(rs.getInt("fatherId"));
            menuItem.setMenuUrl(rs.getString("menuUrl"));
            cach.add(menuItem);
          }
        }
        catch (Exception e) {
          System.out.println("initial:"+e.getMessage());
        }
      }  public void initial() {
         CachedRowSet rs = null;
         try {
           String sql = "select * from Menu order by menuOrder";
           //System.out.println(sql);
           rs = mydb.executeQuery(sql);
           while (rs.next()) {
             Menu menuItem = new Menu();
             menuItem.setMenuId(rs.getInt("menuId"));
             menuItem.setMenuName(rs.getString("menuName"));
             menuItem.setMenuLevel(rs.getInt("menuLevel"));
             menuItem.setFatherId(rs.getInt("fatherId"));
             menuItem.setMenuUrl(rs.getString("menuUrl"));
             cach.add(menuItem);
           }
         }
         catch (Exception e) {
           System.out.println("initial:"+e.getMessage());
         }
       }  public void destroy() {
        cach.clear();
      }  public static void main(String args[]) {
        MenuTree mytree = new MenuTree();
        mytree.initial("1");
        try {
          mytree.getUserMenu(0, "1");
        }
        catch (Exception e) {
          System.out.println(e.getMessage());
        }
        for (int i = 0; i < mytree.tree.size(); i++) {
          Menu myMenu = (Menu) mytree.tree.get(i);
          System.out.println(myMenu.getMenuName());
        }
      }
    }
      

  2.   

    不同意2楼的算法。
    这样的算法,在用户登陆的时候速度极慢,我最开始的时候就是用的这样的算法。在递归的时候查询数据库。一个彩旦刷新要3秒钟,(彩旦表里面才100条记录)
    这样的算法如果数据库io一次10豪秒,那么便利完所有的记录要nlogn*10,
    所以,我采用了把所有的数据库记录都读到一个cach里面。然后在内存中便利。彩旦打开的时间几乎为0。
      

  3.   

    同意三楼的说法,对二楼这样的递归方法不是很赞同,因为生成一颗树的方法很多,如果必须使用这样的递归方法一次性的就生成这颗树,那么我认为这样的节点信息是不足的。递归的效率很低,我曾经用这样的方法实现了一颗2400多个节点的树,但是效率太慢,曾经达到要将近一分钟的荒谬地步。
    后天添加了比较强的父子节点关系,才比较顺利的实现了2400多个节点在20s左右显示出来,为什么,因为2400多个节点中都包含了一个checkbox,如果一个页面上包含了2000左右的checkbox,如果要全部遍历一边也需要11s左右, 我咨询过IE开发小组的人员,他们说这应该是一个没有办法的事情,目前的IE中都是这样的情况。关于源代码,暂时我无法给你,如果你需要,联系我,我可以在国庆以后给你,因为代码在公司的服务器上。:)