数据库只有如下几个字段:
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;
}
}
}
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;
}
}
}
http://topic.csdn.net/u/20101126/12/99686406-ac73-4dbd-8aa2-8db7f913ccf4.html看看。
那个是这样的:
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能在我的那个基础上修改吗?
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进行比较,我那个办法写到了一半,递归那个部分实在是写不出来了