数据库只有如下几个字段:
id     编号
name   菜单名称
parent 父级编号
order  同级排序现在想要在数据库中一次性查询出结果,然后在内存中进行封装数据,需要用到递归算法了,可是怎么也写不出来了,大家帮忙,谢谢大家了。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;
}
}

}

解决方案 »

  1.   


    http://topic.csdn.net/u/20101126/12/99686406-ac73-4dbd-8aa2-8db7f913ccf4.html看看。
      

  2.   

    恩,谢谢楼上的,但是那个最终结果不是我想要的形式
    那个是这样的:
    parent id:1
    sub id   :2
    sub id   :3
    sub id   :3
    sub id   :4
    parent id:2
    sub id   :5
    sub id   :6
    sub id   :7
    sub id   :8
    parent id:3
    sub id   :9
    sub id   :10
    sub id   :11
    sub id   :12我想要的形式是:parent id:1
        sub id   :2
            sub sub id   :3
        sub id   :3
        sub id   :4
            sub sub id   :5
    parent id:6
        sub id   :7
            sub sub id   :8
        sub id   :9
        sub id   :10
            sub sub id   :11能在我的那个基础上修改吗?
      

  3.   

    呀,写错了我想要的形式是:parent id:1
      sub id :2
          sub sub id :3
      sub id :4
      sub id :5
          sub sub id :6
    parent id:7
      sub id :8
          sub sub id :9
      sub id :10
      sub id :11
          sub sub id :12也就是
    id 1和id 7的是同级2,4,5是id 1 的子级
    3是 id2的子级
    6是 id5的子级封装到list里面直接顺序取的话就是这种顺序,顺序使用 list对象的sort方法对对象的order进行比较,我那个办法写到了一半,递归那个部分实在是写不出来了