日期:2014-05-17  浏览次数:20664 次

一个树形的递归算法
数据库只有如下几个字段:
id 编号
name 菜单名称
parent 父级编号
order 同级排序

现在想要在数据库中一次性查询出结果,然后在内存中进行封装数据,需要用到递归算法了,可是怎么也写不出来了,大家帮忙,谢谢大家了。
Java code

package com;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test2 {
    public static void main(String[] args) {
               //使用递归方式提取出封装的数据
    }

    public List<Attr> getResult(){
        List<Attr> list= new ArrayList<Attr>();
        //语句
        String sql="select id,name,parent,order from table";
        //临时封装对象
        Map<Integer,List<Attr>> map = new HashMap<Integer,List<Attr>>();
        // while(rs.next()){
            Attr attr= new Attr();
            // attr.setId(rs.getInt(1));
            // .......省略
            /*
            map封装形式:
                key                      value
               
               parent(同父级编号)        list(一个父级所有的菜单)
            */
            List<Attr> temp=map.get(new Integer(attr.getParent()));
            if(temp!=null){
                temp.add(attr);
            }else{
                temp= new ArrayList<Attr>();
                temp.add(attr);
                map.put(new Integer(attr.getParent()), temp);
            }
        // }
        
        
        //临时    start(没用的代码段)
        List<Attr> parent=map.get(new Integer(0));//第一级    第一级确认父级为0
        if(parent!=null){
            for(int i=0;i<parent.size();i++){
                Attr at1=parent.get(i);
                list.add(at1);
                List<Attr> subParent = map.get(new Integer(at1.getId()));//第二级
                if(subParent!=null){
                    for(int j=0;j<subParent.size();j++){
                        Attr at2=subParent.get(i);
                        at1.setSubAttr(new ArrayList<Attr>());
                        at1.getSubAttr().add(at2);
                        List<Attr> theParent = map.get(new Integer(at2.getId()));//第三级
                        if(theParent!=null){
                            //..............
                        }
                    }
                }
            }
            //排序
 Comparator comp=new ListSort();
 Collections.sort(parent,comp);
        }
        //临时     end
            
        
        return list;
    }
    /**
     * 递归方法
     * @param list
     * @param map
     * @return
     */
    private List<Attr> dealData(List<Attr> list,Map<Integer,List<Attr>> map){
        if(list==null){
            return list;
        }else{
            for(int i=0;i<list.size();i++){
                Attr attr = list.get(i);
                List<Attr> temp=map.get(new Integer(attr.getId()));
                attr.setSubAttr(temp);
                if(temp!=null){
                    for(int j=0;j<temp.size();j++){
                        Attr attr2 = list.get(j);
                        //attr2.setSubAttr(this.dealData(attr2.getSubAttr(), map));
                        //排序
                         //Comparator comp=new ListSort();
                         //Collections.sort(parent,comp);
                    }
                }else{
                    continue;
                }
            }
            //return dealData(list,map);
        }
    }
}

class Attr {
    //主键编号
    private int id;
    //菜单名称
    private String name;
    //父级编号
    private int parent; 
    //同级下排序
    private int order;
    //子菜单对象
    private List<Attr> subAttr;;

    public int getId() {
        return id;
    }

    public List<Attr> getSubAttr() {
        return subAttr;
    }

    public void setSubAttr(List<Attr> subAttr) {
        this.subAttr = subAttr;
    }

    public void setId(int id) {