web-dev-qa-db-ja.com

ネストされたコレクションをよりエレガントに処理する方法はありますか?

私の質問はむしろデザインの質問です。私のプログラムでは、次のようなデータ構造に到達しました。

private ConcurrentHashMap<A, ConcurrentHashMap<B, ConcurrentHashMap<Integer, C>>> services  = new ConcurrentHashMap<A, ConcurrentHashMap<B, ConcurrentHashMap<Integer, C>>>();

そのようなデータ構造をよりエレガントに処理する方法はありますか?ありがとう!

編集:A、B、Cはビジネスクラスです。 Aインスタンスは(関連付けとして)多くのBを「持つことができます」、Bは多数のマッピングを「持つことができる」Integer-C。

8
ovdsrn

TripleABのフィールドを含むクラスIntegerを作成し、hashCode()equals()をオーバーライドします。 Map<Triple,C> の代わりに Map<A,Map<B,Map<Integer,C>>>

このアプローチでは、すべての要素を1つのマップに配置し、可能なキーの範囲を広げます。

16
amit

[私はC#の出身ですが、答えは当てはまります]

[それほど問題ではありませんが、最後の項目はConcurrentHashMap <C、Integer>であると思います]

タイプA->(B->(C-> int))の関数fがある場合本当に必要なものです。答えはわかりません。しかし、おそらく、タイプ(A x B x C)-> intの関数fがあれば十分です。

2つのケースの違いは、最初のケースは遅延があり、より機能的で、おそらくよりエレガントであり、「部分的に適用された」関数を使用できるということです。たとえば、a(タイプAの)要素がある場合、afに適用しますおよびgタイプ(B->(C-> int))の関数を持っている受け渡し、メソッドへの送信など。ただし、関数を適切に初期化するのは少し面倒でもう少しコードです。

2番目の方法は熱心でエレガントではありませんが、コーディングと理解が容易な場合があります。必要なことは、ジェネリッククラスTriple <A、B、C>を作成し、Equals()とGetHashCode()をオーバーライドして、値のセマンティクスを持つようにすることです(2インスタンスは、要素が等しい場合は等しいと見なされます)、ConcurrentHashMapTripleからであることを宣言します)整数。最も明白な支払いコストは、[〜#〜] a [〜#〜][〜#〜] b [ 〜#〜][〜#〜] c [〜#〜]要素は、のインスタンスを作成するために一度にすべて準備できますTripleを実行し、ルックアップを実行します。

編集:最後の項目が本当にConcurrentHashMap <C、Integer>の場合、ジェネリッククラスは[〜#〜] a [〜#〜 ][〜#〜] b [〜#〜]およびIntegerフィールド、およびマッピングはTriple <A、B、Integer>から[〜#〜] c [〜#〜]

6
Ali