В обычной разработке, обучении и интервью мы часто сталкиваемся с древовидной структурой данных. Например, обычное меню с древовидной структурой.
Блоггер недавно столкнулся с интервью структуры данных, и поделился его для всех, чтобы обсудить и учиться.
Темы следующие:
является типичной бесконечной древовидной структурой
1. Идеи решения проблем
Ход моих мыслей
Первый шаг, чтобы получить все данные
Второй шаг - пройти, чтобы получить данные, родительский узел которых равен 0 (данные родительского слоя).
На третьем этапе выполняется обход данных родительского слоя для получения данных дочернего слоя.
Четвертый шаг печатает данные родительского слоя
Пятый шаг — подуровень данных печати.
Результат выглядит следующим образом
Без лишних слов, вот код:
1.Emp
package pojo;
/**
* @作者: tjx
* @描述: 员工对象
* @创建时间: 创建于11:30 2018/9/5
**/
public class Emp {
private Integer ID;
private Integer Parent_ID;
private String Name;
public Integer getID() {
return ID;
}
public void setID(Integer ID) {
this.ID = ID;
}
public Integer getParent_ID() {
return Parent_ID;
}
public void setParent_ID(Integer parent_ID) {
Parent_ID = parent_ID;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
2.EmpTree.java
package pojo;
import java.util.List;
/**
* @作者: tjx
* @描述: 树
* @创建时间: 创建于11:34 2018/9/5
**/
public class EmpTree extends Emp{
private List<EmpTree> childrens;
public List<EmpTree> getChildrens() {
return childrens;
}
public void setChildrens(List<EmpTree> childrens) {
this.childrens = childrens;
}
}
3.EmpDAO.java
package dao;
import pojo.EmpTree;
import java.util.ArrayList;
import java.util.List;
/**
* @作者: tjx
* @描述: 模拟dao层
* @创建时间: 创建于11:38 2018/9/5
**/
public class EmpDAO {
public List<EmpTree> selectAll(){
List<EmpTree> list = new ArrayList<EmpTree>();
EmpTree emp = new EmpTree();
emp.setID(1);
emp.setParent_ID(0);
emp.setName("CEO");
EmpTree emp2 = new EmpTree();
emp2.setID(2);
emp2.setParent_ID(1);
emp2.setName("CTO");
EmpTree emp3 = new EmpTree();
emp3.setID(3);
emp3.setParent_ID(2);
emp3.setName("Eng1");
EmpTree emp4 = new EmpTree();
emp4.setID(4);
emp4.setParent_ID(5);
emp4.setName("Finance1");
EmpTree emp5 = new EmpTree();
emp5.setID(5);
emp5.setParent_ID(1);
emp5.setName("CFO");
EmpTree emp6 = new EmpTree();
emp6.setID(6);
emp6.setParent_ID(5);
emp6.setName("Finance2");
EmpTree emp7 = new EmpTree();
emp7.setID(7);
emp7.setParent_ID(2);
emp7.setName("Eng2");
EmpTree emp8 = new EmpTree();
emp8.setID(8);
emp8.setParent_ID(1);
emp8.setName("Assistant1");
EmpTree emp9 = new EmpTree();
emp9.setID(9);
emp9.setParent_ID(3);
emp9.setName("DevSupport1");
EmpTree emp10 = new EmpTree();
emp10.setID(10);
emp10.setParent_ID(8);
emp10.setName("Intern1");
list.add(emp);
list.add(emp2);
list.add(emp3);
list.add(emp4);
list.add(emp5);
list.add(emp6);
list.add(emp7);
list.add(emp8);
list.add(emp9);
list.add(emp10);
return list;
}
}
4.TreeUtils.java
package utils;
import dao.EmpDAO;
import pojo.EmpTree;
import java.util.ArrayList;
import java.util.List;
/**
* @作者: tjx
* @描述: 用于树形结构转换
* @创建时间: 创建于11:45 2018/9/5
**/
public class TreeUtils {
/** 获取 顶级菜单集合
* @param data 原始数据
* @param pid 父类编号
* @return
*/
public static List<EmpTree> getParentTree(List<EmpTree> data,int pid){
if (data == null) {
return null;
}
List<EmpTree> empTreeList = new ArrayList<EmpTree>();
data.forEach(empTree -> {
if(pid == empTree.getParent_ID()){
empTreeList.add(empTree);
}
});
return empTreeList;
}
/**
* 根据 PID 得到出现个数
* @param data
* @param pid
* @return
*/
public static int getSizeByPid(List<EmpTree> data,int pid){
return (int) data.stream().filter(empTree -> empTree.getParent_ID() == pid).count();
}
/**
* 获取 子节点
* @param data
* @param parent
* @return
*/
public static List getChildrens(List<EmpTree> data,EmpTree parent){
List<EmpTree> result = new ArrayList<EmpTree>();
//找到该菜单下的所有员工
data.forEach(empTree -> {
if(empTree.getParent_ID() == parent.getID()){
result.add(empTree);
}
});
//遍历子菜单
result.forEach(empTree -> {
int count = getSizeByPid(data, parent.getID());
if(count>0){
//递归调用
empTree.setChildrens(getChildrens(data,empTree));
}
});
return result;
}
/**
* 打印子菜单
* @param data
*/
public static void printChildrens(List<EmpTree> data,String oldStr){
if(oldStr == null){
oldStr = "-->";
}
String finalOldStr = oldStr;
data.forEach(empTree -> {
System.out.println(finalOldStr +empTree.getName() );
if(empTree.getChildrens()!=null){
printChildrens(empTree.getChildrens(),finalOldStr+"-->");
}
});
}
/**
* 打印父层数据
* @param data 原始数据
*/
public static void print(List<EmpTree> data){
data.forEach(empTree -> {
System.out.println(empTree.getName());
if(empTree.getChildrens()!=null){
printChildrens(empTree.getChildrens(),null);
}
});
}
public static void main(String[] args) {
EmpDAO empDAO = new EmpDAO();
//此处模拟DB操作
List<EmpTree> rootData = empDAO.selectAll();
//获取父类菜单
List<EmpTree> parentTree = getParentTree(rootData, 0);
//遍历
parentTree.forEach(empTree -> {
empTree.setChildrens(getChildrens(rootData,empTree));
});
print(parentTree);
}
}
Комментарии и комментарии приветствуются, и если есть какие-либо несоответствия, пожалуйста, дайте рекомендации от экспертов в отрасли, спасибо! ! !