Google の Guava API の機能を調べているときに、「実際のプログラミング」の経験では見たことのないデータ構造、つまり BiMap に出くわしました。この構成の唯一の利点は、指定された値のキーをすばやく取得できることですか? BiMap を使用して解を表現するのが最適な問題はありますか?
質問する
1025 次
2 に答える
9
2 つのマップにデータを入力することなく、逆ルックアップを実行できるようにしたい場合。たとえば、名前で電話番号を検索したい電話帳ですが、番号から名前を取得するために逆引きも行いたいとします。
于 2013-03-09T17:42:54.447 に答える
5
BiMap
Louisは、実装で可能なメモリ節約について言及しました。Map
これは、2つのインスタンスをラップすることによって取得できない唯一のことです。Map
それでも、インスタンスをラップさせていただければ、いくつかのエッジケースを処理できます。(これらすべてを自分で処理できますが、なぜわざわざするのですか?:))
- を呼び出すと
put(newKey, existingValue)
、2つのマップの同期を維持するためにすぐにエラーが発生します。一方のマップにエントリを追加してから、もう一方のマップと競合していることに気付くのではありません。(forcePut
既存の値を上書きする場合に提供します。)挿入null
またはその他の無効な値に対して同様の保護手段を提供します。 BiMap
ビューは2つのマップの同期を維持します。元のentrySet
のから要素を削除するBiMap
と、対応するエントリも逆から削除されます。でも同じようなことをしEntry.setValue
ます。- シリアル化を処理します。A
BiMap
とその逆は「接続」されたままで、エントリは1回だけシリアル化されます。 - ラッパーのラッパーではなく、を返す
inverse()
ようにのスマートな実装を提供します。foo.inverse().inverse()
foo
- オーバーライド
values()
して。を返しますSet
。このセットはinverse().keySet()
、元のセットと同じ反復順序を維持することを除いて、取得するセットと同じですBiMap
。
于 2013-03-11T14:57:49.233 に答える