/**
* 树形数据实体接口
* @param <E>
* @author fushuai
* @date 2018年3月22日
*/
public interface TreeEntity<E> {
public String getId();
public String getParentId();
public void setChildList(List<E> childList);
}
/**
* 解析树形数据工具类
*
* @author fushuai
* @date 2018年3月22日
*/
public class TreeParser{
/**
* 解析树形数据
* @param topId
* @param entityList
* @return
* @author fushuai
* @date 2018年3月22日
*/
public static <E extends TreeEntity<E>> List<E> getTreeList(String topId, List<E> entityList) {
List<E> resultList=new ArrayList<>();
//获取顶层元素集合
String parentId;
for (E entity : entityList) {
parentId=entity.getParentId();
if(parentId==null||topId.equals(parentId)){
resultList.add(entity);
}
}
//获取每个顶层元素的子数据集合
for (E entity : resultList) {
entity.setChildList(getSubList(entity.getId(),entityList));
}
return resultList;
}
/**
* 获取子数据集合
* @param id
* @param entityList
* @return
* @author fushuai
* @date 2018年3月22日
*/
private static <E extends TreeEntity<E>> List<E> getSubList(String id, List<E> entityList) {
List<E> childList=new ArrayList<>();
String parentId;
//子集的直接子对象
for (E entity : entityList) {
parentId=entity.getParentId();
if(id.equals(parentId)){
childList.add(entity);
}
}
//子集的间接子对象
for (E entity : childList) {
entity.setChildList(getSubList(entity.getId(), entityList));
}
//递归退出条件
if(childList.size()==0){
return null;
}
return childList;
}
}
* 树形数据实体接口 * @param <E> * @author fushuai * @date 2018年3月22号
*/
public interface TreeEntity<E> {
public String getId();
public String getParentId();
public void setChildList(List<E> childList);
}
public class Menu implements TreeEntity<Menu>{
public String id;
public String name;
public String parentId;
public List<Menu> childList;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public List<Menu> getChildList() {
return childList;
}
public void setChildList(List<Menu> childList) {
this.childList = childList;
}
}
public class Test {
public static void main(String[] args) {
List<Menu> list=new ArrayList<>();
Menu menu1=new Menu();
menu1.setId("1");
menu1.setParentId("0");
menu1.setName("菜单1");
list.add(menu1);
Menu menu2=new Menu();
menu2.setId("2");
menu2.setParentId("0");
menu2.setName("菜单2");
list.add(menu2);
Menu menu3=new Menu();
menu3.setId("3");
menu3.setParentId("1");
menu3.setName("菜单11");
list.add(menu3);
Menu menu4=new Menu();
menu4.setId("4");
menu4.setParentId("3");
menu4.setName("菜单111");
list.add(menu4);
List<Menu> menus=TreeParser.getTreeList("0",list);
System.out.println(menus);
}
}