1.首先我们得有一个树状结构的表,类似这种结构。必须得有 id,pid 其他的根据需要来。
我们叫它treeTbl表吧。这里pid为0的表示是顶级节点。
2.接着select * from treeTbl ,并将得到的list 转换成一个Map集合,
key 为 pid ,value 为 子元素对象集合或者子元素id集合之类的都可以,根据需要。
我这里只需要id,所以是定义为了List<string>类型。
Map<String,List<String>> map=new HashMap<String,List<String>>(); for(Object[] obj : list) { String id=obj[0].toString(); String pid=obj[1].toString(); if(map!=null && map.get(pid)!=null){ map.get(pid).add(dic_id); }else{ List<String> list_tmp=new ArrayList<String>(); list_tmp.add(id); map.put(pid,list_tmp); } }
3.递归遍历,说明在注释中
//最终得到的子孙集合 List<String> idList=new ArrayList<String>(); /* 这个pid的值根据需要来, 如果要获取整棵树,这里就填根节点的id,treeTbl表中的根节点的 id 为 0 如果是获取指定父级节点下的所有子孙节点,就填该父节点的 id 值 */ List<String> chidrenList=map.get(pid); /* 上面得到的chidrenList仅仅是底下一层的节点集合,也就是说只包含了子节点,未包含子节点下的所有子孙节点 如果变量pid表示第一层的话,这里我们从第二层开始递归 也就是不停的寻找下一层下一层下一层……直到不存在下一层为止 如何判断有无下一层呢,之前创建好的HashMap已存好父子关系,用它来判断就好 */ for(String id : childrenList){ //用于递归的方法,只有把 id 下的所有子孙节点全部存入idList,才会进行下一轮循环 getChildrens(map, id ,idList); } //将之前第一层子节点也加入进来(这个地方根据需要来) idList.addAll(chidrenList);
private void getChildrens(Map<String,List<String>> map,String id,List<String> idList) { //查询当前id下的子级的集合 List<String> list=map.get(id); //如果list不为空,则表示该id下还有子id,重新调用当前方法进行递归查询 if(list!=null && list.size()>0){ for(String id2 : list){ //存入集合 idList.add(id2); //再查一次 getChildrens(map, id2, idList); } } }