0

の値に基づいてキーを変更する状況に遭遇しましたHashMap。私HashMapは:

HashMap<Key, Path>

最初にKey、ディレクトリごとに を作成Pathし、これらのエントリを に配置しHashMapます。加工する際はfromをPath元に加工していきます。場合によっては、一部を再計算し、そのために古いものを新しいものに置き換えたい. 一意のパスの一意のキーを保持し、HashMap のエントリをいずれかで更新したいと考えています。そこで、HashMap の逆を実行して Key を更新したいと考えています。これに最適なテクニックは何ですか?KeyHashMapKeyPathKeyKeyPath

前もって感謝します。

4

7 に答える 7

5

Google GuavaBiMap.

バイマップ (または「双方向マップ」) は、値の一意性とキーの一意性を保持するマップです。この制約により、bimap は「逆ビュー」をサポートできます。これは、この bimap と同じエントリを含むが、キーと値が逆になっている別の bimap です。

于 2013-01-18T14:37:53.387 に答える
3

別の HashMap を追加して、逆マッピングを行います。元のマップとの同期を保つだけです。2 つのマップ間ですべての操作が確実に同期されるようにするヘルパー クラスも作成します。

于 2013-01-18T14:35:18.430 に答える
1

キーを更新する場合は、次のようにします。

   String oldKey = "oldKey";
   String newKey = "newKey";

   map.put(newKey, map.remove(oldKey));

値に基づいてキーを取得するには、次のいずれかを使用できます。


お楽しみとして、2 つのマップを維持する方法を次に示します。

    Map<String, String> keyMap = new HashMap<String, String>();
    Map<String, String> valueMap = new HashMap<String, String>();

    String val = "someVal";
    keyMap.put("newKey", keyMap.remove(valueMap.get(val)));
    valueMap.put(val, "newKey");

于 2013-01-18T14:36:24.167 に答える
0

新しいキーを設定する場合は、

hm.set(newKey, oldPath);

あなたのはどこhmですかHashMap。次に、

hm.remove(oldKey)

古いキーを削除します。

Path同じのが2つある可能性がある場合は、一方が他方を上書きするため、Keyを逆にする必要があることに注意してください。値をルックアップしてそのキーを取得するには、andループスルー(リンクされた投稿への更新1)を使用します。HashMap<Path, Key>KeyentrySet()

お役に立てれば!

于 2013-01-18T14:40:10.323 に答える
0

Assuming the bidirectional hash is guaranteed to be 1-to-1 and there are no concerns of memory usage, this is a pure java solution.

public class BiHash<K> extends ConcurrentHashMap<K, K>  {

    public void biPut(K k1, K k2)
    {
        super.put(k1, k2);
        super.put(k2, k1);
    }

}
于 2015-07-01T19:01:58.113 に答える
0

私は...するだろう

myHashMap.remove(Key);

それから

myHashMap.put( newKey, new value);

hashMap の反復中は、削除オプションは許可されません。

于 2013-01-18T14:37:32.607 に答える