Java数据封装成树形结构,多级
参考地址:https://blog.csdn.net/chendu500qiang/article/details/91493147
方法一
1、实体类
@data public class PublishServiceType implements Comparable<PublishServiceType>{ /** * */ private static final long serialVersionUID = -3572108154932898825L; /* * @see {code} * @comment 类型标识 */ private String code; /* * @see {createtime} * @comment 创建时间 */ private java.util.Date createtime; /* * @see {defaultmanual} * @comment 服务类型默认使用手册 */ private String defaultmanual; /* * @see {description} * @comment 服务类型描述 */ private String description; /* * @see {id} * @comment 主键 */ private String id; /* * @see {isdelete} * @comment 是否可以删除 */ private Integer isdelete; /* * @see {lastmodifytime} * @comment 最近修改时间 */ private java.util.Date lastmodifytime; /* * @see {name} * @comment 服务类型名称 */ private String name; /* * @see {parentid} * @comment 服务类型父节点 */ private String parentid; /** * 排序 */ private Integer sort; private List<PublishServiceType>children; }
2、数据封装
@Override public List<PublishServiceType> findList(String name) { List<PublishServiceType>list = publishServiceTypeMapper.findByName(name); if (JudgeUtil.isEmpty(list)){ return null; } //父子级组装 return parentAndChildren(list); } private List<PublishServiceType>parentAndChildren(List<PublishServiceType> list){ //最顶层根节点 List<PublishServiceType>rootList = new ArrayList<>(); //非最顶层根节点 List<PublishServiceType>bodyList = new ArrayList<>(); for (PublishServiceType publishServiceType : list) { if (StringUtils.isBlank(publishServiceType.getParentid())){ rootList.add(publishServiceType); }else{ bodyList.add(publishServiceType); } } return getTree(rootList,bodyList); } public List<PublishServiceType> getTree(List<PublishServiceType>rootList, List<PublishServiceType>bodyList){ if (!JudgeUtil.isEmpty(bodyList)){ //声明一个map,用来过滤已操作过的数据 Map<String,String> map = new HashMap<>(bodyList.size()); rootList.forEach(parent->getChild(parent,bodyList,map)); return rootList; }else{ return rootList; } } private void getChild(PublishServiceType parent,List<PublishServiceType>bodyList, Map<String,String> map){ List<PublishServiceType>childList = new ArrayList<>(); bodyList.stream().filter(c->!map.containsKey(c.getId())) .filter(c->c.getParentid().equals(parent.getId())) .forEach(c->{ map.put(c.getId(),c.getParentid()); getChild(c,bodyList,map); childList.add(c); }); parent.setChildren(childList); }
二、方法二
/**
* 构建树形关系
* @param list
* @return
*/
private List<T> getMenuList(List<T>list,Map<String){
List<T>tList = new LinkedList<>(list);for (T parent : list) {
for (T child : list) {
//形成树形关系的字段
if (parent.getId().equals(child.getParentId())){
List<T> children = parent.getChildren();
if (null == children){
children = new ArrayList<>();
parent.setChildren(children);
}
children.add(out);
tList.remove(out);
}
}
}
return tList;
}