106

ハッシュマップキーの名前を変更する方法を探していますが、Javaでそれが可能かどうかわかりません。

4

9 に答える 9

156

要素を削除して、新しい名前で再度配置してみてください。マップ内のキーがであると仮定すると、次のStringように実現できます。

Object obj = map.remove("oldKey");
map.put("newKey", obj);
于 2012-05-26T14:05:18.527 に答える
28
hashMap.put("New_Key", hashMap.remove("Old_Key"));

これはあなたが望むことをしますが、あなたは鍵の場所が変わったことに気付くでしょう。

于 2016-10-30T14:27:45.103 に答える
21

名前を変更する必要があるキーの値を新しいキーに割り当てます。そして、古いキーを削除します。

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
于 2013-12-18T06:07:50.233 に答える
12

key追加したハッシュマップの名前を変更/変更することはできません。

唯一の方法は、を削除/削除し、 newとpairkeyで挿入することです。keyvalue

理由:ハッシュマップの内部実装で、keyとしてマークされたハッシュマップ修飾子final

static class Entry<K ,V> implements Map.Entry<K ,V>
{
    final K key;
    V value;
    Entry<K ,V> next;
    final int hash;
    ...//More code goes here
}

参考:HashMap

于 2015-06-26T09:19:09.597 に答える
4

ハッシュマップキーの名前を変更するのではなく、新しいキーで新しいエントリを挿入し、古いキーを削除する必要があります。

于 2012-05-26T14:05:18.433 に答える
3

hasmapキーの本質はインデックスアクセスの目的であり、ハックに他なりません。キーの値の周りにキーラッパークラスを作成して、キーラッパーオブジェクトがインデックスアクセスのハッシュマップキーになるようにします。特定のニーズに合わせて、キーラッパーオブジェクトの値にアクセスして変更する場合があります。

public class KeyWrapper<T>{

      private T key;
      public KeyWrapper(T key){
         this.key=key;
       }

      public void rename(T newkey){
              this.key=newkey;
       }

}

   HashMap<KeyWrapper,String> hashmap=new HashMap<>();
   KeyWrapper key=new KeyWrapper("cool-key");
   hashmap.put(key,"value");
   key.rename("cool-key-renamed");

存在しないキーでハッシュマップから既存のキーの値を取得できるようにすることもできますが、とにかく、それが犯罪である可能性があるのではないかと思います。

public  class KeyWrapper<T>{

        private T key;
        public KeyWrapper(T key){
            this.key=key;
        }

        @Override
        public boolean equals(Object o) {
            return hashCode()==o.hashCode();
        }

        @Override
        public int hashCode() {
            int hash=((String)key).length();//however you want your hash to be computed such that two different objects may share the same at some point
            return hash;
        }
    }

HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper cool_key=new KeyWrapper("cool-key");
KeyWrapper fake_key=new KeyWrapper("fake-key");
hashmap.put(cool_key,"cool-value");
System.out.println("I don't believe it but its: "+hashmap.containsKey(fake_key)+" OMG!!!");
于 2019-07-28T18:15:12.580 に答える
1

私の場合、非実数キー->実数キーを含むマップがあったので、非実数をマップ内の実数に置き換える必要がありました(アイデアは他の人と同じです)

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
于 2020-05-12T16:00:00.540 に答える
1

以下の点をご覧ください。

  1. いいえ、一度追加したkeyのの名前を変更することはできません。HashMap

  2. まず、それを削除または削除する必要があります。次に、newを使用してkey挿入できます。keyvalue

  3. HashMap内部実装では、キーHashMap修飾子はfinalです。

于 2020-05-12T16:19:24.847 に答える
0

JavaネイティブのHashMapの代わりに、Bimapを使用することもできます。
これは従来のMap実装ではなく、ニーズに合っていることを確認する必要があります。

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

バイマップを使用すると、ビューを反転してキーを置き換えることができます。ApacheCommonsBidiMapGuavaBiMap
の両方をチェックアウトします。

于 2019-06-06T13:55:07.840 に答える