私の質問はむしろデザインの質問です。私のプログラムでは、次のようなデータ構造に到達しました。
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。
Triple
、A
、B
のフィールドを含むクラスInteger
を作成し、hashCode()
とequals()
をオーバーライドします。 Map<Triple,C>
の代わりに Map<A,Map<B,Map<Integer,C>>>
このアプローチでは、すべての要素を1つのマップに配置し、可能なキーの範囲を広げます。
[私はC#の出身ですが、答えは当てはまります]
[それほど問題ではありませんが、最後の項目はConcurrentHashMap <C、Integer>であると思います]
タイプA->(B->(C-> int))の関数fがある場合本当に必要なものです。答えはわかりません。しかし、おそらく、タイプ(A x B x C)-> intの関数fがあれば十分です。
2つのケースの違いは、最初のケースは遅延があり、より機能的で、おそらくよりエレガントであり、「部分的に適用された」関数を使用できるということです。たとえば、a(タイプAの)要素がある場合、aをfに適用しますおよびgタイプ(B->(C-> int))の関数を持っている受け渡し、メソッドへの送信など。ただし、関数を適切に初期化するのは少し面倒でもう少しコードです。
2番目の方法は熱心でエレガントではありませんが、コーディングと理解が容易な場合があります。必要なことは、ジェネリッククラスTriple <A、B、C>を作成し、Equals()とGetHashCode()をオーバーライドして、値のセマンティクスを持つようにすることです(2インスタンスは、要素が等しい場合は等しいと見なされます)、ConcurrentHashMapがTripleからであることを宣言します)整数。最も明白な支払いコストは、[〜#〜] a [〜#〜]、[〜#〜] b [ 〜#〜]、[〜#〜] c [〜#〜]要素は、のインスタンスを作成するために一度にすべて準備できますTripleを実行し、ルックアップを実行します。
編集:最後の項目が本当にConcurrentHashMap <C、Integer>の場合、ジェネリッククラスは[〜#〜] a [〜#〜 ]、[〜#〜] b [〜#〜]およびIntegerフィールド、およびマッピングはTriple <A、B、Integer>から[〜#〜] c [〜#〜]