使用java遍历父子关系
我有一个输入,比如——使用java遍历父子关系,java,tree,hashmap,parent-child,hierarchy,Java,Tree,Hashmap,Parent Child,Hierarchy,我有一个输入,比如—— emp_id,emp_name,manageremp_id 1,A, 2,B,1 4,C,1 3,F,4 5,E,2 我希望输出像—— 1,A, 2,B,/A/B 4,C,/A/C 3,F,/A/C/F 5,E,A/B/E 我知道这可以通过Oracle分层查询实现。然而,数据来自平面文件,我们不想进行分段。你知道我们如何使用java来实现吗。 使用两个HashMap,我可以做一些直到- 1,A 2,B,A 4,C,A 3,F,C 但是,我无法打印完整路径。任何人都可
emp_id,emp_name,manageremp_id
1,A,
2,B,1
4,C,1
3,F,4
5,E,2
我希望输出像——
1,A,
2,B,/A/B
4,C,/A/C
3,F,/A/C/F
5,E,A/B/E
我知道这可以通过Oracle分层查询实现。然而,数据来自平面文件,我们不想进行分段。你知道我们如何使用java来实现吗。
使用两个HashMap,我可以做一些直到-
1,A
2,B,A
4,C,A
3,F,C
但是,我无法打印完整路径。任何人都可以帮助我使用java来完成它。创建一个名为Employee的类,其字段为
id
,name
,managerId
。将所有这些员工存储在映射中,其中键是员工的ID,值是具有此ID的员工
然后,对于每位员工,您可以通过在地图中反复查找其经理,轻松获取其所有管理链:
public void fillManagementChain(Deque<Employee> chain, Employee employee) {
chain.addFirst(employee);
if (employee.getManagerId() != null) {
Employee manager = employeesById.get(employee.getManagerId());
fillManagementChain(chain, manager);
}
}
公共管理链(德克链,员工){
链。addFirst(员工);
if(employee.getManagerId()!=null){
Employee manager=employeesById.get(Employee.getManagerId());
管理链(链、经理);
}
}
其余部分是解析和格式化。可以使用以下代码-
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Emp {
private static Map<Integer,Emp> empMap= new HashMap<>();
private Integer empId;
private String empName;
private Integer mgrId;
public Integer getMgrId() {
return mgrId;
}
public static Emp createEmp(Integer empId, String empName, Integer mgrId){
Emp e= new Emp(empId, empName, mgrId);
empMap.put(empId,e);
return e;
}
private Emp(Integer empId, String empName, Integer mgrId) {
this.empId = empId;
this.empName = empName;
this.mgrId = mgrId;
}
private String getManagerName(Integer empId){
if (Emp.empMap.get(empId).getMgrId() == null) {
return Emp.empMap.get(empId).empName;
}else {
return getManagerName(Emp.empMap.get(empId).getMgrId()) + "/" +
Emp.empMap.get(empId).empName;
}
}
@Override
public String toString() {
String displayManager = getManagerName(empId).equals(empName)?"":getManagerName(empId);
return empId + "," +
empName + "," +
displayManager;
}
public static void main(String[] args) {
List<Emp> emps = new ArrayList<>();
emps.add(Emp.createEmp(1,"A",null));
emps.add(Emp.createEmp(2,"B",1));
emps.add(Emp.createEmp(4,"C",1));
emps.add(Emp.createEmp(3,"F",4));
emps.add(Emp.createEmp(5,"E",2));
for(Emp emp:emps){
System.out.println(emp);
}
}
}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共级电磁脉冲{
私有静态映射empMap=newhashmap();
私有整数empId;
私有字符串名称;
私有整数mgrId;
公共整数getMgrId(){
返回mgrId;
}
公共静态Emp createEmp(整数empId、字符串empName、整数mgrId){
Emp e=新的Emp(empId、empName、mgrId);
empMap.put(empId,e);
返回e;
}
私有Emp(整数empId、字符串empName、整数mgrId){
this.empId=empId;
this.empName=empName;
this.mgrId=mgrId;
}
私有字符串getManagerName(整数empId){
if(Emp.empMap.get(empId.getMgrId()==null){
返回Emp.empMap.get(empId.empName);
}否则{
返回getManagerName(Emp.empMap.get(empId.getMgrId())+“/”+
Emp.empMap.get(empId.empName);
}
}
@凌驾
公共字符串toString(){
字符串displayManager=getManagerName(empId).equals(empName)?“”:getManagerName(empId);
返回empId+“,”+
empName+“,”+
显示器管理器;
}
公共静态void main(字符串[]args){
List emps=new ArrayList();
Emp.add(Emp.createEmp(1,“A”,null));
Emp.add(Emp.createEmp(2,“B”,1));
Emp.add(Emp.createEmp(4,“C”,1));
Emp.add(Emp.createEmp(3,“F”,4));
Emp.add(Emp.createEmp(5,“E”,2));
用于(Emp Emp:Emp){
系统输出打印项次(emp);
}
}
}