当前位置: 代码迷 >> Java Web开发 >> 一个树形的递归算法解决办法
  详细解决方案

一个树形的递归算法解决办法

热度:1576   发布时间:2013-02-25 21:09:03.0
一个树形的递归算法
数据库只有如下几个字段:
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) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getParent() {        return parent;    }    public void setParent(int parent) {        this.parent = parent;    }    public int getOrder() {        return order;    }    public void setOrder(int order) {        this.order = order;    }}class ListSort implements Comparator{    public int compare(Object o1, Object o2) {        Attr uc1=(Attr)o1;        Attr uc2=(Attr)o2;        if(uc1.getOrder()<uc2.getOrder()){            return 1;        }else{            return 0;        }    }    }
  相关解决方案