2009-08-07 16 views
0

私の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

に少し推敲だけ*なぜあなただ​​けのHashtableを使用することができますし、ベクターは役立つだろう*。それはJ2MEの制限のためか、スレッドセーフな構造が必要なためですか? – jprete

+0

...宿題なので...。 –

+0

私はJavaの世界ではかなり新しいですし、私の目標を達成するために他の使用可能なデータ型をJ2MEで見つけられませんでした。あなたは?私は質問のタイトルを変更するつもりです。 –

答えて

1

GetChildrenメソッドは、()はるかに効率的である可能性があります。それは、あなたがそれを呼び出すたびに、CompanyList全体を反復して、その親が与えられたCompanyIdに一致するものを見つけるように見えます。それは、ベクトルでいっぱいのハッシュテーブルのために悲鳴を上げるだけです。ハッシュテーブルのキーは元のIDではなく、親のIDになります。その値は、その親IDが所与の親IDと一致する会社の会社名を含むベクトルになります。次に、あなたが持っている:

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

は、それがgetSubTreeを書面であなたの目的のように見えます構造私は今説明したハッシュテーブルに実際にあります。ここで問題となるのは、Company by Companyではなくcompany-IDでcompany-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構造を固執することができます。

編集:ここでは関係のポイントは、あなたがそれらを必要としてあなたはハッシュテーブルのベクトルエントリを怠惰な初期化できるということです。ハッシュテーブルに必要なエントリがあるかどうかを確認するたびにチェックすることができます。ハッシュテーブルに必要なエントリがあるかどうかを確認するたびに、それをスローするだけです。これは、ハッシュテーブルを、親として反復するのではなく、 。ハッシュテーブルとベクトル以外のものを本当に使用できない場合、これはツリーを実装する悪い方法ではありません。それは、隣接リストを使用してグラフのデータ構造を保持することとほぼ同じです。実際には、HashMapsを使用していても、グラフのデータ構造の場合と非常によく似たものを書いています。

まあ、助けてくれますか?

+0

それは助けます!ありがとう! –

関連する問題