2

Google の Guava API の機能を調べているときに、「実際のプログラミング」の経験では見たことのないデータ構造、つまり BiMap に出くわしました。この構成の唯一の利点は、指定された値のキーをすばやく取得できることですか? BiMap を使用して解を表現するのが最適な問題はありますか?

4

2 に答える 2

9

2 つのマップにデータを入力することなく、逆ルックアップを実行できるようにしたい場合。たとえば、名前で電話番号を検索したい電話帳ですが、番号から名前を取得するために逆引きも行いたいとします。

于 2013-03-09T17:42:54.447 に答える
5

BiMapLouisは、実装で可能なメモリ節約について言及しました。Mapこれは、2つのインスタンスをラップすることによって取得できない唯一のことです。Mapそれでも、インスタンスをラップさせていただければ、いくつかのエッジケースを処理できます。(これらすべてを自分で処理できますが、なぜわざわざするのですか?:))

  • を呼び出すとput(newKey, existingValue)、2つのマップの同期を維持するためにすぐにエラーが発生します。一方のマップにエントリを追加してから、もう一方のマップと競合していることに気付くのではありません。(forcePut既存の値を上書きする場合に提供します。)挿入nullまたはその他の無効な値に対して同様の保護手段を提供します。
  • BiMap ビューは2つのマップの同期を維持します。元のentrySetのから要素を削除するBiMapと、対応するエントリも逆から削除されます。でも同じようなことをしEntry.setValueます。
  • シリアル化を処理します。ABiMapとその逆は「接続」されたままで、エントリは1回だけシリアル化されます。
  • ラッパーのラッパーではなく、を返すinverse()ようにのスマートな実装を提供します。foo.inverse().inverse()foo
  • オーバーライドvalues()して。を返しますSet。このセットはinverse().keySet()、元のセットと同じ反復順序を維持することを除いて、取得するセットと同じですBiMap
于 2013-03-11T14:57:49.233 に答える