【问题标题】:Recursive Java data structure - creating an array of a family tree递归 Java 数据结构 - 创建一个家族树的数组
【发布时间】:2015-04-02 14:17:51
【问题描述】:

如何创建一个高效的递归函数 - 它将接受一个输入提要 - 可能有 1000 行长。成一个紧凑的数组。递归函数可能需要某种查找来确定当前员工 ID 之上是否有经理。

我正在尝试构建一个可能需要数组中的整个关系管理树的应用程序。

我需要想出一种方法来在输入数据馈送上创建递归函数,以将其映射到整理的输出数组。

//the input data may look something like this
[{
    "employeeId": "A1",
    "managerId": "B1",
    "employeeRole": "Sales0",
    "managerRole": "Sales1"
}, {
    "employeeId": "B1",
    "managerId": "C1",
    "employeeRole": "Sales1",
    "managerRole": "Sales2"
}, {
    "employeeId": "C1",
    "managerId": "D1",
    "employeeRole": "Sales2",
    "managerRole": "Sales3"
}, {
    "employeeId": "D1",
    "managerId": "",
    "employeeRole": "Sales3",
    "managerRole": "Sales4"
}]


//create a final output array like this
[
    "level1id": "A1",
    "level2id": "B1",
    "level3id": "C1",
    "level4id": "D1",
]

我现阶段的基本伪代码是这样的

void myMethod(String employeeId, String[] rawData, Map < String, String > dataMap) {

    //employeeId -- child id

    //rawData - from feed 

    //dataMap - the array being built to contain ALL relationships from grand child, parent, grandparent.



    getManager(employeeId, rawData) {

        //find the manager of the current employeeid

        //managerData[0] - manager id
        //managerData[1] - manager role

        return managerData;
    }


    managerData = getManager(employeeId, rawData);

    managerId = managerData[0];
    managerRole = managerData[1];

    dataMap.put(managerData[1], managerData[0]);
    // like [{"customerLevel1" : "SKDOL2"}]



    //if there is no manager id - the grandparent manager has been found
    if (managerId !== null)
        return;
    else {
        //this employeeid has a manager above them - loop through again until the grandparent is found (employee id with no manager) 
        myMethod(managerId, rawData, dataMap);
        return;
    }
}

【问题讨论】:

  • 哦,这是一个不错的项目。你有什么问题?
  • 问题 - 是 - 我如何将输入数据有效地转换为压缩数组。
  • 所以在你的问题中这么说。如果你还没有读过How to Ask,你会想读;这太宽泛了,因为您只是要求我们为您提供代码。
  • 是的 - 谢谢你的迂腐 cmets - 我已经编辑了帖子以重新执行问题 - 我专注于手头所需的逻辑
  • 更改标题可能也值得 - 您不是在寻找递归 Java 函数,而是在寻找递归 Java 数据结构。这不是一个迂腐的声明,也不是@QPaysTaxes',这是一种改进您的问题并因此增加您获得好答案的机会的方法。

标签: java arrays recursion


【解决方案1】:

您需要做一些工作来读取数据并对其进行解析并构建您的数据结构,但是对于类关系来说,这样的事情看起来很接近您应该需要的。

class Person {

    private final String id;

    public Person(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

}

class Employee extends Person {

    private final String managerId;

    public String getManagerId() {
        return managerId;
    }

    public Employee(String id, String managerId ) {
        super(id);
        this.managerId = managerId;
    }

}

class Manager extends Employee {

    private final String role;

    public String getRole() {
        return role;
    }

    public Manager(String id, String managerId, String role ) {
        super(id, managerId);
        this.role = role;
    }

}

/**
 * Use this to look up any person. 
 * 
 * Put ALL employees an managers in here as you read them.
 */
Map<String, Employee> personLookup = new HashMap<>();

【讨论】:

    【解决方案2】:

    我假设你的输入数据格式是 json,所以你需要json.jar

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import org.json.JSONArray;
    import org.json.JSONObject;
    
    public class OrgnizationTree {
    
        HashMap<String, ArrayList<Employee>> jsonDataMap = new HashMap<String, ArrayList<Employee>>();
        HashMap<String, Employee> employeeMap = new HashMap<String, Employee>();
        Employee root;
    
        public void buildTree(String jsonData) throws Exception {
            JSONArray array = new JSONArray(jsonData);
            for (int i = 0; i < array.length(); i++) {
                JSONObject object = (JSONObject) array.get(i);
                String employeeId = object.get("employeeId").toString();
                String managerId = object.get("managerId").toString();
                if (managerId == null || managerId.isEmpty()) {
                    root = new Employee(employeeId, null);
                } else {
                    Employee subordinate = new Employee(employeeId);
                    if (jsonDataMap.containsKey(managerId)) {
                        jsonDataMap.get(managerId).add(subordinate);
                    } else {
                        ArrayList<Employee> subordinates = new ArrayList<Employee>();
                        subordinates.add(subordinate);
                        jsonDataMap.put(managerId, subordinates);
                    }
                }
            }
            for (Employee subordinate : jsonDataMap.get(root.getId())) {
                root.addSubordinate(subordinate);
                subordinate.setManager(root);
                employeeMap.put(root.getId(), root);
                buildSubTree(subordinate);
            }
        }
    
        public void buildSubTree(Employee manager) {
            List<Employee> subordinates = jsonDataMap.get(manager.getId());
            if (subordinates != null) {
                for (Employee subordinate : subordinates) {
                    subordinate.setManager(manager);
                    manager.addSubordinate(subordinate);
                    buildSubTree(subordinate);
                }
            }
            employeeMap.put(manager.getId(), manager);
        }
    
        public Employee getManager(String employeeId) {
            Employee employee = employeeMap.get(employeeId);
            Employee manager = employee.getManager();
            return manager;
        }
    
        public Employee getEmployee(String employeeId) {
            return employeeMap.get(employeeId);
        }
    
        public Employee getRoot() {
            return root;
        }
    
        public class Employee {
            String id;
            Employee manager;
            List<Employee> subordinates;
            Integer level;
    
            Employee(String id, Employee manager) {
                this.id = id;
                this.manager = manager;
                if (manager == null) {
                    level = 0;
                } else {
                    level = manager.level + 1;
                }
            }
    
            Employee(String id) {
                this.id = id;
            }
    
            public void addSubordinate(Employee subordinate) {
                if (subordinates == null) {
                    subordinates = new ArrayList<Employee>();
                }
                subordinates.add(subordinate);
            }
    
            public String getId() {
                return this.id;
            }
    
            public Employee getManager() {
                return manager;
            }
    
            public void setManager(Employee manager) {
                this.manager = manager;
                this.level = manager.level + 1;
            }
    
        }
    
        public static void main(String[] args) throws Exception {
            String jsonData = "[{'employeeId': 'A1', 'managerId': 'B1'}, {'employeeId': 'B1', 'managerId': 'C1'}, "
                    + "{'employeeId': 'C1', 'managerId': 'D1'}, {'employeeId': 'D1', 'managerId': ''}]";
            OrgnizationTree t = new OrgnizationTree();
            t.buildTree(jsonData);
            System.out.println(t.getManager("A1").getId());
            System.out.println(t.getEmployee("A1").getManager().getId());
            System.out.println(t.getRoot().getId());
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 2019-04-14
      • 1970-01-01
      • 2016-03-18
      • 2019-12-18
      • 1970-01-01
      • 2013-04-13
      • 2016-01-17
      • 2013-12-20
      相关资源
      最近更新 更多