2012-02-01 4 views
3

するこの実装を向上させることができ、私が入ってくるオブジェクトを処理するために必要なサービスのメソッドを持っています(ちなみに、これは擬似コードです)どのように私はより効率的

public class IncomingParentObject { 
    public Collection<IncomingChildOject> childObjects; 
} 

public Class IncmoingChildObject { 
    public String name; 
} 

私はの「レジストリ」を持っています入ってくる子オブジェクトのサブセットを気にする "クライアント"。登録時点では、「名前」のみがわかります。クライアントオブジェクトは、情報を転送するためにトランスポート層の詳細をカプセル化します。

public class Registry { 
    // String represents the name in the child object 
    public Map<String, Set<Client>> clients; 
} 

今のサービスクラスは、この線に沿って何かである:

public void processIncmoingParentObject(IncomingParentObject parentObject) { 
    for (IncmoingChildObject childObject : parentObject.childObjects) { 
     Set<Client> clients = registry.clients.get(childObject.name); 

     for (Client client : clients) { 
      this.transportLayer.transportChildObject(childObject, client); 
     } 
    } 
} 

これは(高価なまたは時宜を得てもよい)トランスポート層には、いくつかの呼び出しになります。私は基本的にこれをChildObjectのサブセットのクライアントごとに1つのトランスポートに減らしたいと考えています。

transportLayer.transport(Client client, Set<IncmoingChildObject> childObjects); 

クライアントに送信する子のサブセットを決定するために、親の子どもをスキャンするのはどんな効果的な方法でしょうか。

+0

これはCodeReview.SEの方が良いでしょうか? –

+0

私はそれが何であるか分かりません。 – predhme

+0

これは、コードレビューのためのStackExchangeサイドです。リンク:http://codereview.stackexchange.com/私は、より良い/より良い答えが得られるかもしれないと思っていましたが、ここで回答が得られているようです。 –

答えて

3

ClientごとにSet<IncomingChildObject>を記録するためにマップを使用します。テストされていないJavaでは

public void processIncomingParentObject(IncomingParentObject parentObject) { 
    Map<Client,Set<IncomingChildObject>> childObjectsByClient = 
     new Map<Client,Set<IncomingChildObject>>(); 
    for (IncomingChildObject childObject : parentObject.childObjects) { 
     Set<Client> clients = registry.clients.get(childObject.name); 
     for (Client client : clients) { 
      Set<IncomingChildObject> childObjects = 
       childObjectsByClient.get(client); 
      if (childObjects == null) { 
       childObjects = new Set<IncomingChildObject>(); 
       childObjectsByClient.put(client, childObjects); 
      } 
      childObjects.add(childObject); 
     } 
    } 
    for (Entry<Client,Set<IncomingChildObject>> e : childObjectsByClient.entrySet()) { 
     this.transportLayer.transport(e.getKey(), e.getValue()); 
    } 
} 
+0

パーフェクト、ありがとう – predhme

1

まあ、マップ名 - >子のリストを作成してから、リストを反復して地図の各キーのクライアントを取得できます。その後、そのクライアントとマップエントリの子のリストをトランスポート層に渡します。

これは、Apache Commons CollectionsプロジェクトでMultimapの実装の1つを試してみることができます(ジェネリックはサポートしていませんが、サードパーティのポートがあります。Google Guavaを試してみます。マルチマップを提供します)。

+0

もちろん、Guavaは 'Multimap'を提供しています。これは完全に生成され、JDKコレクションでうまくいきます。 ;) –

+0

@ルイスは情報をありがとう:) – Thomas

+0

病気に感謝してください。 – predhme

関連する問題