2

我想通过在java中使用递归函数来获取父子关系数组。我尝试了一些方法来显示我想要的,但它看起来有问题。请给我一些建议和指导。

我的数据库中有 3 个表;部门, 公司, 部门

部门

dept_cd company_cd
100     0017
101     0017
102     0017
103     0017
200     0017
201     0017
202     0017
300     0017
301     0017
302     0017
303     0017
304     0017
999     0017

公司

company_cd  
0017
0018

部门树

dept_cd (Parent)    child_dept_cd
100                 101
100                 999
200                 201
200                 202
300                 301
300                 302
101                 102
102                 103
302                 303
302                 304

我想显示(在控制台中)如下。

[100]
[100,101]
[100,101,102]
[100,101,102,103]
[100,999]
[200]
[200,201]
[200,202]
[300]
[300,301]
[300,302]
[300.302,303]
[300,302,304]

在我的程序中,我写了以下内容。

    ArrayList<ArrayList<String>> g_nodes = new ArrayList<ArrayList<String>>();

    functionA() {
       String p_DeptCd = functionB(g_ssp.g_gp.getParam("company_cd"), 0);
       //e.g: company_cd = 0017, 0 means '0017 does not have parent'
    }
    functionB(String x_dept_cd, int x_flag){
        PmsSql p_sql = new PmsSql(g_ssp);
    if (x_flag == 0) {
        p_sql.setField("dept.dept_cd, dept.dept_cd_nk, dept.dept_nm, dept.dept_disp_nm");
        p_sql.setTable("dept INNER JOIN company ON dept.company_cd = company.company_cd");
        p_sql.addWhere("dept.company_cd = ?");
        p_sql.addWhere("dept.dept_cd NOT IN (SELECT child_dept_cd FROM depttree)");
        p_sql.addWhereValue("company_cd", x_dept_cd);
        p_sql.setOrder("dept.disp_order desc");
    }
    if (x_flag == 1) {
        p_sql.setField("dept.dept_cd, dept.dept_disp_nm");
        p_sql.setTable("dept INNER JOIN depttree ON dept.dept_cd = depttree.child_dept_cd");
        p_sql.setWhere("dept.dept_cd_nk IS NOT NULL");
        p_sql.addWhere("depttree.dept_cd = ?");
        p_sql.addWhereValue("dept_cd", x_dept_cd);
        p_sql.setOrder("dept.disp_order desc");
    }
    p_sql.execQuery();
    while (p_sql.next()) {
        String p_dept_cd = p_sql.getString("dept_cd");
        ArrayList<String> p_childArr = new ArrayList<String>();

        if(x_flag == 1){
            p_childArr.add(x_dept_cd);
        }

        p_childArr.add(p_dept_cd);
        g_nodes.add(p_childArr);
        System.out.println("g_nodes = "+g_nodes);
        functionB(p_dept_cd, 1);
    }
    return null;
    }

但它是这样显示的。

g_nodes = [[100], [100, 999], [100, 101], [101, 102], [102, 103], [200], [200, 201], [200, 202], [300], [300, 301], [300, 302], [302, 303], [302, 304]]

我很抱歉我的描述太长了。提前致谢。

4

1 回答 1

0

首先,我认为您的问题过于复杂。

  1. 公司与问题无关
  2. DeptTree 可以简单地看作是 Dept 表中的一个额外的“parent_dept”。
  3. Dept的大部分专栏与问题无关

所以你的问题可以简化为:

Dept
--------
DEPT_CD    PARENT_DEPT_CD   

最大的问题是:我在您的原始代码中看不到任何递归函数。而且您还没有清楚地告诉我们您的预期行为是什么。

如果您只是获取所有部门并显示每个部门及其所有父部门,则可以简单地将部门(带有部门代码和父部门代码)放在地图中,使用部门代码作为键。然后对于map中的每一个dept,递归的展示parent的dept代码,然后再展示自己的代码。

像这样的东西:

    //....
    for (Dept dept : deptMap.values()) {
        displayDept(dept, deptMap);
    }
    //.....

void displayDept(Dept dept, Map<String, Dept> deptMap) {
    if (dept has parent) {
       Dept parentDept = deptMap.get(dept.parent);
       displayDept(parentDept, deptMap);
    }
    display dept.code
}

(只是给你一个想法,请自己写正确的代码)

如果您使用的是 Oracle(从 SQL 和我看来的约定),您还可以考虑使用分层查询,这可以大大减少您构建节点层次结构的工作:http: //docs.oracle.com/cd/ B19306_01/server.102/b14200/queries003.htm

于 2013-11-11T03:34:12.530 回答