高效树排序

时间:2009-08-07 14:46:44

标签: java data-structures java-me tree

我对我在J2ME应用程序中构建树结构的方法不满意。 任何人都能指出更高效的方向吗?如果您需要更多代码来理解我的代码段,请在下面进行评论。 Java版本是1.4。

非常感谢,
rAyt

if(companyList != null) {
    companyList.setNodeStructure(null);

    Hashtable nodes = new Hashtable();
    for(Enumeration e = companyList.elements(); e.hasMoreElements();) {
        Company temp_comp = (Company)e.nextElement();
        if(temp_comp.getParentCompanyId() == 0 && temp_comp.getCompanyId() > 0) {
            getSubTree(temp_comp.getCompanyId(), companyList, nodes); 
        }
    }   
    companyList.setNodeStructure(nodes);

方法

private void getSubTree(int CompanyId, CompanyList _companyList, Hashtable nodes) {
    Vector children = getChildren(CompanyId, _companyList);
    if(children.size() > 0) {
        nodes.put(new Integer(CompanyId), children);
        for(Enumeration e = children.elements(); e.hasMoreElements();) {
            Company temp_comp = (Company)e.nextElement();
            getSubTree(temp_comp.getCompanyId(), _companyList, nodes);
        }
    }
}

private Vector getChildren(int CompanyId, CompanyList _companyList) {
    Vector temp = new Vector();
    for(Enumeration e = _companyList.elements(); e.hasMoreElements();) {
        Company temp_comp = (Company)e.nextElement();
            if(temp_comp.getParentCompanyId() == CompanyId) {
                temp.addElement(temp_comp);
            }
        }
    temp.trimToSize();
    return temp;
}

1 个答案:

答案 0 :(得分:1)

getChildren()可能更有效率。看起来,每次调用它时,您都会遍历整个CompanyList,以找到其父匹配给定CompanyId的那些。这只是为一个充满了矢量的Hashtable而尖叫。 Hashtable键是父ID,而不是原始ID;值将是包含父ID与给定父ID匹配的公司的向量。然后你有:

private Vector getChildren(int CompanyId, Hashtable companyParentLoookup) {
    return (Vector) companyParentLookup.get(CompanyId);
}

当然,看起来你写的getSubTree的目标实际上是构造我刚才描述的Hashtable。这里的问题是你试图通过公司ID而不是公司公司来构建公司ID。您可以尝试这样做,以构建companyParentLookup:

private Hashtable calcLookupTable(CompanyList _companyList) {
    Hashtable retval = new Hashtable();
    for (Enumeration e = _companyList.elements(); e.hasMoreElements();) {
        Company temp_comp = (Company) e.nextElement();
        Integer parent_id = temp_comp.getParentCompanyID();

        if (retval.containsKey(parent_id) == false) {
            retval.put(parent_id, new Vector());
        }
        retval.get(parent_id).add(temp_comp);
    }
    return retval;
}

然后,您可以将companyParentLookup结构直接粘贴到companyList的nodeStructure中。

编辑:这里的相关点是你可以根据需要懒惰地初始化Hashtable的向量条目;每次你可以检查Hashtable是否有所需的条目,如果没有,你就把它扔进去。这就是你可以通过迭代公司作为孩子来创建Hashtable而不是作为父母迭代它们。如果你真的不能使用除Hashtables和Vectors之外的任何东西,那么这不是一个实现树的坏方法;它大致相当于使用邻接列表保持图形数据结构。实际上,我为一个图形数据结构编写了一些非常类似的东西,尽管有HashMaps。

呃,这有帮助吗?