2

Google collections/GuavaのBiMapにはまだかなり戸惑っています。2 つの bimap は同じデータに裏打ちされていると主張されました。一方への変更は、他方に表示されます。

ソースコードをざっと見てみると、デリゲートの使い方がForwardingMap. しかし、 の実際のサブクラスではStandardBiMap、データがフォワード マップとリバース マップの両方に配置されていることがわかります。では、本質は何であり、データのコピーを 1 つだけ保持することでスペースを節約したと主張するのはなぜでしょうか? 実際のオブジェクトは 1 つのセットですが、これらのオブジェクトへの参照の 2 つの異なるセットがまだ必要であり、1 つのセットはフォワード マップで維持され、もう 1 つはリバース マップで維持されますか? ここでの BiMap の本質と、クライアントがあまりにも別個のマップを維持し、それに応じて更新を行う代替アプローチとは何ですか?

  private V putInBothMaps(K key, V value, boolean force) {
    boolean containedKey = containsKey(key);
    if (containedKey && Objects.equal(value, get(key))) {
      return value;
    }
    if (force) {
      inverse().remove(value);
    } else if (containsValue(value)) {
      throw new IllegalArgumentException(
          "value already present: " + value);
    }
    V oldValue = super.put(key, value);
    updateInverseMap(key, containedKey, oldValue, value);
    return oldValue;
  }
4

1 に答える 1

8

BiMapデータのコピーを 1 つだけ保持することでスペースを節約できるという主張はどこにありますか? BiMapそのデータが変更されても両方が一貫性を保つ一連のエントリの順方向ビューと逆方向ビューを提供するだけです。節約は、2 つのマップを手動で管理する必要がなく、両方が独自のコードで更新されることを確認することです (さらに、マップの 1 つに重複した値が追加され、矛盾した状態が発生する場合のエラー チェック)... を使用するだけですBiMapそして、それらすべてをあなたに任せてください。

スペースを節約することではなく、コードをシンプルで読みやすく、正確に保つことが重要です。

于 2012-05-31T16:48:15.820 に答える