要求 表结构
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; }