Java-从csv文件创建嵌套树视图

Java-从csv文件创建嵌套树视图,java,arraylist,tree,nested,Java,Arraylist,Tree,Nested,我搜索过类似的问题,但找不到明确的解决方案,所以希望有人能帮我。 我对Java相当陌生,并尝试执行以下操作,但有点卡住了。 问题: 我有一个CSV文件,有三个字段:String、int、String 这是一个组织列表,显示了我所在部门的140人以及他们的经理,我想创建一个嵌套的树结构,显示整个组织 CSV字段为:employee、numberOfDirectReports、manager e、 g.样本可能是: Bob, 5, Dave Dave, 2, Alice Sam, 0, Bob

我搜索过类似的问题,但找不到明确的解决方案,所以希望有人能帮我。 我对Java相当陌生,并尝试执行以下操作,但有点卡住了。 问题: 我有一个CSV文件,有三个字段:String、int、String 这是一个组织列表,显示了我所在部门的140人以及他们的经理,我想创建一个嵌套的树结构,显示整个组织

CSV字段为:employee、numberOfDirectReports、manager e、 g.样本可能是:

Bob, 5, Dave

Dave, 2, Alice

Sam, 0, Bob
这告诉我爱丽丝在树顶上,戴夫向她报告。Dave自己有两个直接下属,其中一个是Bob。Bob有5个直接下属,其中一个是Sam。Sam没有直接下属

爱丽丝

到目前为止,我所做的是创建一个名为Employee的类,它有三个变量字符串employeeID、int numDirectReports和String manager 我创建了一个名为employeeList的ArrayList,其中包含140个Employee实例

我可以打印出员工及其经理的名单。 但我想做的是遍历列表/数组(如果我把术语混在一起,我表示歉意),并为整个人群生成类似于上面树结构的内容

有什么想法吗? 我是否需要为此创建另一个中间数据结构?如果是,我如何初始化并填充它?
或者我可以只使用我已经填充的员工列表打印我正在使用的树类型吗

您需要的是更新每个员工,以便在其内部添加一个直接位于其下方的员工列表。(我正忙着写代码来解释:))

在添加链接之前,可以更新步骤2,以检查管理者是否已知,以避免NPE。另一个解决方案是动态创建管理器,并将其添加到同一片段的映射中

if(employee.manager != null){
                // we retrieve the manager from the map and add this employee in the list inside it
                Employee manager = employees.get(employee.manager);
                if(manager != null){
                    // manager has been loaded before
                    manager.add(employee);
                }
            }

如果我理解正确的话,你会有一个这样的课程:

public class Employee {
    private String employeeID;
    private String manager;
    int numDirectReports;
    private List<Employee> employeeList;

...
}
现在,要在构建树的同时加载CSV,我将使用
映射


非常感谢你们两位。奇怪的是,Maurice,当我键入Map allEmployees=newHashMap()时;标记“;”上的语法错误,{应在该标记之后,如果删除分号,该错误将消失(但这将是无效语法)我犯了一个错误eclipse@Stephen这确实很奇怪。检查前面的语句。谢谢Wisthler,这很好,但是当我尝试在调用CSV读取器时替换,并从文件中读取值时,它会抛出一个空指针异常。显然,我正在出错,但我无法弄清楚到底是什么。试试看(BufferedReader br=Files.newBufferedReader(pathToFile)){String line=br.readLine();而(line!=null){String[]attributes=line.split(“,”);String empID=attributes[0];int numCounselees=Integer.parseInt(attributes[1]);String consuller=attributes[2];employees.put(empID,new Employee(empID,numCounselees,consuller));line=br.readLine();}}catch(IOException ioe){ioe.printStackTrace();}System.out.println(employees);我相当肯定我正在从CSV文件读取数据,因为我可以将文件中的姓名列表打印到控制台,例如{john.smith=john.smith,george.best=george.best}注意:为了保护无辜者,我已经替换了上面的名称,但是我在tutorialOne.Employee.main(Employee.java:78)第78行包含System.out.println(employees.get(“denis.law”).toString()的线程“main”java.lang.NullPointerException中得到了这个错误异常;其中denis.law是我的根节点,即我组织树的顶部,如示例中的Alice employees.get(“…”)中的值需要与csv中的值100%匹配,没有大小写问题,没有空间问题,没有什么不同。有根据的猜测,您的情况并非如此:)
Alice
    Dave
        Bob
            BobOtherReport0
            BobOtherReport2
            BobOtherReport1
            BobOtherReport3
            Sam
        DaveOtherReport
if(employee.manager != null){
                // we retrieve the manager from the map and add this employee in the list inside it
                Employee manager = employees.get(employee.manager);
                if(manager != null){
                    // manager has been loaded before
                    manager.add(employee);
                }
            }
public class Employee {
    private String employeeID;
    private String manager;
    int numDirectReports;
    private List<Employee> 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);
    }
}
    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();
}