java - Java - 从 csv 文件创建嵌套树视图
问题描述
我已经搜索了类似的问题,但找不到明确的解决方案,所以希望有人能提供帮助。我对Java相当陌生,并试图做以下事情,但有点卡住了。问题:我有一个包含三个字段的 CSV 文件:String、int、String 这是一个组织列表,其中显示了我部门中的 140 人以及他们的经理,我想创建一个嵌套的树结构来显示整个组织。
CSV 字段是:员工、numberOfDirectReports、经理,例如样本可能是:
Bob, 5, Dave
Dave, 2, Alice
Sam, 0, Bob
所以这告诉我爱丽丝在树的顶端,戴夫向她报告。Dave 本人有 2 个直接下属,其中之一是 Bob。Bob 有 5 个直接下属,其中之一是 Sam。山姆没有直接下属。
爱丽丝
- Dave
- DavesOtherReport
- Bob
- Sam
- BobsOtherReport
- BobsOtherReport
- BobsOtherReport
- BobsOtherReport
到目前为止,我所做的是创建一个名为 Employee 的类,其中包含三个变量 String employeeID、int numDirectReports、String manager 我创建了一个名为 employeeList 的 ArrayList,其中包含 140 个 Employee 实例。
我可以打印出员工及其经理的名单。但是我想要做的是遍历列表/数组(如果我混合了我的术语,请道歉)并为整个人口生成类似于上述树结构的东西。
有任何想法吗?我需要为此创建另一个中间数据结构吗?如果是这样,我如何初始化然后填充它?或者我可以只使用我已经填充的employeeList 打印我正在使用的那种树吗?
解决方案
因此,如果我对您的理解正确,您将有这样的课程:
public class Employee {
private String employeeID;
private String manager;
int numDirectReports;
private List<Employee> employeeList;
...
}
几点评论:
- 为什么不声明
manager
为Employee
?使用起来不是更简单吗? - 字段
numDirectReports
是多余的:它的值应该等于employeeList.size()
. - 同一个员工不应该在
employeeList
某个经理中出现两次。
所以我宁愿声明一个类如下:
public class Employee {
private String employeeID;
private Employee manager;
private final Set<Employee> employeeSet = new HashSet<>();
public String getEmployeeID() {
return employeeID;
}
public void setEmployeeID(String employeeID) {
this.employeeID = employeeID;
}
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
public Set<Employee> getEmployeeSet() {
return new HashSet<>(employeeSet);
}
public void addEmployee(Employee e) {
employeeSet.add(e);
}
}
现在,要在构建树的同时加载 CSV,我将使用Map<String,Employee>
:
Map<String,Employee> allEmployees = new HashMap<>();
for (String[] record: csvRecords()) {
String id = record[0];
int redundant = Integer.parseInt(record[1]);
String managerId = record[2];
Employee emp = allEmployees.get(id);
if (emp == null) {
emp = new Employee();
emp.setEmployeeID(id);
allEmployees.put(id, emp);
}
Employee manager = null;
if (managerId != null && managerId.length() > 0) {
manager = allEmployees.get(managerId);
if (manager == null) {
manager = new Employee();
manager.setEmployeeID(managerId);
allEmployees.put(managerId, manager);
}
manager.addEmployee(emp);
}
emp.setManager(manager);
}
更新
如果您需要直接报告的数量,您可以添加一个方法:
public int numberOfDirectReports() {
return employeeSet.size();
}
推荐阅读
- java - Java 和 mysql - ResultSet 的问题
- scala - 为什么 scalac 似乎将隐式扩展得太远了?
- java - 如何将 QueryDocumentSnapshot 传递给另一个活动?
- django - 从 Angular App 到 Django REST API 的 API 请求 - 被 CORS 阻止
- python - 如何将 tmpdir 与我的 pytest.fixture 一起使用?
- c - 使用openmp进行高斯消除
- javascript - 使用 getComputedStyle 确定何时触发了伪元素,而不仅仅是出现在元素上?
- php - 从 JSON 文件中收集值以用于 MySQL `IN` 子句
- linux - 变量在循环后丢失它们的值
- html - 带有平铺背景图像的 CSS 多列问题