使用java遍历父子关系

时间:2013-03-01 06:58:41

标签: 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

但是,我无法打印完整路径。谁能帮助我用java做这件事。

2 个答案:

答案 0 :(得分:0)

创建一个名为Employee的类,其中包含字段idnamemanagerId。将所有这些员工存储在Map<Integer, Employee>中,其中密钥是员工的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);
    }
}

其余的是解析和格式化。

答案 1 :(得分:0)

可以使用以下代码-

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


}