我有一个像
这样的输入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做这件事。
答案 0 :(得分: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);
}
}
其余的是解析和格式化。
答案 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);
}
}
}