好记性不如烂笔头,在此收录两个采用递归将List数据组织成树结构数据的方法。
方法1:
定义实体类:
public class Menu {
private String id;
private String parentId;
private String name;
private List<Menu> children;
public Menu() {
}
public Menu(String id, String parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Menu> getChildren() {
return children;
}
public void setChildren(List<Menu> children) {
this.children = children;
}
}
调用实现:
public class MenuTest {
public static void main(String[] args) throws JsonProcessingException {
// 构造测试数据
Menu menu1 = new Menu("1", null, "1");
Menu menu2 = new Menu("1-1", "1", "1");
Menu menu3 = new Menu("1-1-1", "1-1", "1-1-1");
Menu menu4 = new Menu("2", null, "2");
Menu menu5 = new Menu("2-1", "2", "2-1");
Menu menu6 = new Menu("2-1-1", "2-1", "2-1-1");
Menu menu7 = new Menu("1-2", "1", "1-2");
List<Menu> list = new ArrayList<>();
list.add(menu1);
list.add(menu2);
list.add(menu3);
list.add(menu4);
list.add(menu5);
list.add(menu6);
list.add(menu7);
// 生成树的方法
List<Menu> tree = createTree(list);
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(tree);
System.out.println(json);
}
// 构造树形结构
public static List<Menu> createTree(List<Menu> sourceList) {
List<Menu> list = new ArrayList<>();
for (Menu menu : sourceList) {
// 找到根节点进行处理,找下一级节点
if (null == menu.getParentId()) {
// 把所有的根节点放到一个list
list.add(findChildren(menu, sourceList));
}
}
return list;
}
public static Menu findChildren(Menu rootMenu, List<Menu> list) {
// 这个方法是在找rootMenu的所有子节点,然后返回rootMenu
for (Menu menu : list) {
if (rootMenu.getId().equals(menu.getParentId())) {
if (rootMenu.getChildren() == null) {
rootMenu.setChildren(new ArrayList<>());
}
// 把这个节点menu作为新的根节点继续向下构造树,再把构造的结果作为rootMenu的子节点
rootMenu.getChildren().add(findChildren(menu, list));
}
}
return rootMenu;
}
}
方法2:
定义实体类:
public class TreeBean {
/**
* id
*/
private Integer id;
/**
* 名称
*/
private String name;
/**
* 父id ,根节点为0
*/
public Integer parentId;
/**
* 子节点信息
*/
public List<TreeBean> childList;
public TreeBean() {
}
public TreeBean(Integer id, String name, Integer parentId, List<TreeBean> childList) {
this.id = id;
this.name = name;
this.parentId = parentId;
this.childList = childList;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public List<TreeBean> getChildList() {
return childList;
}
public void setChildList(List<TreeBean> childList) {
this.childList = childList;
}
/**
* 初始化数据
*
* @return
*/
public List<TreeBean> initializationData() {
List<TreeBean> list = new ArrayList<>();
TreeBean t1 = new TreeBean(1, "广东省", 0, new ArrayList<>());
TreeBean t2 = new TreeBean(2, "湖南省", 0, new ArrayList<>());
TreeBean t3 = new TreeBean(3, "广州市", 1, new ArrayList<>());
TreeBean t4 = new TreeBean(4, "长沙市", 2, new ArrayList<>());
TreeBean t5 = new TreeBean(5, "白云区", 3, new ArrayList<>());
TreeBean t6 = new TreeBean(6, "黄浦区", 3, new ArrayList<>());
TreeBean t7 = new TreeBean(7, "白云街道", 5, new ArrayList<>());
TreeBean t8 = new TreeBean(8, "深圳市", 1, new ArrayList<>());
TreeBean t9 = new TreeBean(9, "宝安区", 8, new ArrayList<>());
TreeBean t10 = new TreeBean(10, "福田区", 8, new ArrayList<>());
TreeBean t11 = new TreeBean(11, "南山区", 8, new ArrayList<>());
TreeBean t12 = new TreeBean(12, "南山街道", 11, new ArrayList<>());
TreeBean t13 = new TreeBean(13, "芙蓉区", 4, new ArrayList<>());
TreeBean t14 = new TreeBean(14, "岳麓区", 4, new ArrayList<>());
TreeBean t15 = new TreeBean(15, "开福区", 4, new ArrayList<>());
TreeBean t16 = new TreeBean(16, "岳阳市", 2, new ArrayList<>());
TreeBean t17 = new TreeBean(17, "岳麓街道", 14, new ArrayList<>());
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
list.add(t5);
list.add(t6);
list.add(t7);
list.add(t8);
list.add(t9);
list.add(t10);
list.add(t11);
list.add(t12);
list.add(t13);
list.add(t14);
list.add(t15);
list.add(t16);
list.add(t17);
return list;
}
}
调用实现:
public class TreeTest {
public static void main(String[] args) throws JsonProcessingException {
// 获取数据
List<TreeBean> treeBeans = new TreeBean().initializationData();
// 获取父节点
List<TreeBean> collect = treeBeans.stream().filter(t -> t.getParentId() == 0).map(m -> {
m.setChildList(getChildren(m, treeBeans));
return m;
}).collect(Collectors.toList());
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(collect);
System.out.println(json);
}
/**
* 递归查询子节点
*
* @param root 根节点
* @param all 所有节点
* @return 根节点信息
*/
public static List<TreeBean> getChildren(TreeBean root, List<TreeBean> all) {
List<TreeBean> children = all.stream().filter(t -> {
return Objects.equals(t.getParentId(), root.getId());
}).map(m -> {
m.setChildList(getChildren(m, all));
return m;
}).collect(Collectors.toList());
return children;
}
}
感谢分享,原文链接如下: