0

我有一个类似的输入 -</p>

emp_id,emp_name,manageremp_id
1,A,
2,B,1
4,C,1
3,F,4
5,E,2

我想要的输出是这样的——</p>

1,A,
2,B,/A/B
4,C,/A/C
3,F,/A/C/F
5,E,A/B/E

我知道这可以通过 Oracle 分层查询来实现。但是,数据来自平面文件,我们不想进行暂存。关于我们如何使用 java 来做到这一点的任何想法。使用两个 HashMap 我可以做一些直到 -</p>

1,A
2,B,A
4,C,A
3,F,C

但是,我无法打印完整路径。谁能帮我用java来做。

4

2 回答 2

0

创建一个名为 Employee 的类,其字段为id, name, managerId。将所有这些员工存储在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);
    }
}

剩下的就是解析和格式化。

于 2013-03-01T07:15:43.800 回答
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);
        }
    }


}
于 2020-09-25T12:47:53.730 回答