2009-08-07 5 views
0

내 J2ME 응용 프로그램에서 트리 구조를 만드는 방법이 만족스럽지 않습니다. 누구든지 더 효과적인 방향을 지적 할 수 있습니까? 내 스 니펫을 이해하기 위해 더 많은 코드가 필요한 경우 아래에 의견을 남기십시오. Java 버전은 1.4입니다.효율적인 트리 정렬

많은 감사,

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

그냥 * 왜 * 당신은 해시 테이블을 사용할 수 있으며 벡터는 도움이 될 것입니다. J2ME의 한계 때문에 또는 스레드 안전 구조가 필요하기 때문입니까? – jprete

+0

... 또는 숙제이기 때문에. –

+0

나는 자바 세계에서 아주 새로운데, 내 목표를 달성하기 위해 J2ME에서 다른 유용한 데이터 유형을 찾지 못했다. 너? 질문 제목을 바꿀거야. –

답변

1

getChildren()는 훨씬 더 효율적이 될 수를 rAyt. 당신이 그것을 호출 할 때마다 전체 CompanyList를 반복하여 부모가 주어진 CompanyId와 일치하는 것을 찾는 것처럼 보입니다. 그것은 Vectors로 채워진 Hashtable에 대해 비명을 지르는 것입니다. Hashtable 키는 원래 ID가 아닌 부모 ID입니다. 값은 회사의 상위 ID가 주어진 상위 ID와 일치하는 벡터를 포함합니다. 그런 다음 당신은 :

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

, 그것은 getSubTree을 서면으로 당신의 목표처럼 보인다 구조 난 그냥 설명하는 해시 테이블에 실제로있다. 여기서 문제는 Company by Company보다는 회사 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; 
} 

당신은 다음 companyList의 nodeStructure에 직접 companyParentLookup 구조를 고수 할 수 있습니다.

EDIT : 여기서 필요한 것은 Hashtable의 벡터 항목을 필요에 따라 지연 초기화 할 수 있다는 것입니다. 매번 Hashtable에 필요한 항목이 있는지 확인할 수있는 때마다, 그냥 입력하면됩니다. 이는 회사를 부모로서 반복하지 않고 자식으로 반복하여 Hashtable을 만들 수 있도록 해줍니다 . Hashtables와 Vectors 이외의 다른 것을 사용할 수 없다면, 이것은 트리를 구현하는 나쁜 방법은 아닙니다. 인접 목록을 사용하여 그래프 데이터 구조를 유지하는 것과 거의 같습니다. 실제로 HashMaps를 사용했지만 그래프 데이터 구조의 경우와 매우 비슷하게 보이는 무언가를 썼습니다.

어, 도움이 되나요?

+0

도움이됩니다! 감사! –

관련 문제