私は一般的な必要があると思うデータ構造が必要です
重複する値を許可するマップが必要です、しかし)ポイントになって...待つ...
重複した値を許可し、キーのある値のリストを返す双方向マップが必要です
k1 -> v1
k2 -> v1
k3 -> v1
k4 -> v2
k5 -> v2
このサンプルを参照してください、私はmap.getByValue(V1)を行う場合は今、私はセット(K1、K2、K3)を取得する必要があります。さもなければ、それは '普通の'地図のように振る舞います。それは高性能を持っているはずですので、forループのような提案はお願いしません。
また、(ノートは、k1が両方のリストにある)私が今までこのような状況をたくないので、次のことが...私
v1 -> (k1, k2, k3)
v2 -> (k4, k5)
のために行うことはありませんのでご注意...
v1 -> (k1, k2, k3)
v2 -> (k4, k5, k1)
Iドン2つのマップソリューションを使いたい。私はgetByValue(value)がまだ実行可能になるようにソートされた値を保持する何らかの方法を考えています。
なぜ、 'vi - >(k1、k2、...、kn)'があなたのために働いていないのですか?あなたのキーは実際には値であり、その逆もそうです。 'hashCode'(と' equals')を正しくオーバーライドすると、 "キー"は決して複数のリストの一部になることはありません。 – beatngu13
2つのマップソリューションは実装が簡単で、キーによるO(1)ルックアップと値によるO(1)ルックアップを提供します。値でソートされたセカンダリインデックスを維持することができます。それはいくらかのスペースを節約しますが、維持することは難しく、値による検索はO(log n)になります。さらに、値の変更、追加、削除(つまりmap [k] = value')はO(log n)となりますが、2マップ解ではO(1)となります。 –