使用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);
}
}
}