顺序排列的集合排序为树形集合

来源:互联网 发布:djvu转pdf软件 编辑:程序博客网 时间:2024/06/15 00:01

要求   表结构   

ID , 父ID,层级,当前层排序号 (例子如下)   层级和当前层排序号为提供原始集合排序使用


public class ResourceVo {   /**    * 资源编号    */   private String id;   /**    * 资源名称    */   private String name;   /**    * 父资源编号    */   private String parentId;   /**    * 创建时间    */   private Date createTime;   /**    * 修改时间    */   private Date updateTime;   /**    * 子资源集合 来自resourceVo,为了兼容前端页面    */   private List<ResourceVo> list;   /**    * 排序    */   private int sort;   /**    * 层级    */   private int grade;   get和set方法略。  }
/** * 生成树形数据 * @param resources 原始按照层级顺序排序后的集合 * @param resource_id  第一个ID编号 * @return 排序后的树图 */public List<ResourceVo> getTree(List<ResourceVo> resources, String resource_id){    //创建返回的树图集合    List<ResourceVo> rootResources = new ArrayList<ResourceVo>();    //遍历原始集合    for (ResourceVo thisResources : resources) {        //判断第一个元素 (ID等于指定的ID)        if (thisResources.getId().equals(resource_id)) {            //放入结果集合            rootResources.add(thisResources);        } else {            //查询出遍历对象的父对象            ResourceVo parentMobCateBarVo = findResources(rootResources, thisResources.getParentId());            //判断父类型不为空(为空表示原始排序有问题)            if (parentMobCateBarVo != null) {                //判断父类型下面是否有集合,没有创建集合                if (parentMobCateBarVo.getList() == null) {                    parentMobCateBarVo.setList(new ArrayList<ResourceVo>());                }                //把遍历对象放到父对象的集合中                parentMobCateBarVo.getList().add(thisResources);            } else {                log.error("数据问题:" + thisResources);            }        }    }    //返回排序后的树状集合    return rootResources;}/** * 获取父类型 * @param rootResources 树图集合 * @param tagetId 遍历对象的父类型ID * @return */private ResourceVo findResources(List<ResourceVo> rootResources, String tagetId) {    //遍历树图集合    for (ResourceVo mobCateBarVo : rootResources) {        //如果遍历对象的ID等于传入的ID返回当前遍历对象        if (mobCateBarVo.getId().equals( tagetId)) {            return mobCateBarVo;        }        //如果遍历对象中保存的对象集合不为空迭代调用        if (mobCateBarVo.getList() != null && mobCateBarVo.getList().isEmpty() == false) {            ResourceVo tg = findResources(mobCateBarVo.getList(), tagetId);            if (tg != null) {                return tg;            }        }    }    //集合遍历完毕没有找到返回空    return null;}