Hashmapキーの名前を変更することは可能ですか?


89

Hashmapキーの名前を変更する方法を探していますが、Javaで可能かどうかはわかりません。


11
まあ、私はそうではないことを願っています。キーと値のペアを削除して再入力する方法のようです。とにかく、通常はマップ自体の参照のみを処理することに注意してください。
Maarten Bodewes、2012年

4
ハッシュエントリのキーは変更しないでください。運が良ければ、それを同じハッシュコードの何かに変更し、何が起こったのかを理解しようとするだけで、少し頭がおかしくなります。運が悪いと、見つからないエントリができてしまいます(テーブル全体の次の再構築まではそうではありません)。削除/再挿入はより健全であり、かなり安価であるはずです(結局のところ、これはすべて参照です)。
ドナルフェロー

回答:


137

要素を削除して、新しい名前で再度配置してください。マップのキーがであると仮定すると、Stringその方法で達成できます。

Object obj = map.remove("oldKey");
map.put("newKey", obj);

59
+1。そして最も読みやすいのはmap.put( "newKey", map.remove( "oldKey" ) );、提供されている内容ですoldKey
Ravinder Reddy

15
読みやすさに関する限り、私はまったく同意しません。個人的には、オブジェクトがマップから削除されてから追加されることをはっきりと確認することを好みます。そして、OPはJavaにとってかなり新しいもののようですので、私はそれをそのように置くことにしました。ただし、パフォーマンスのために、もちろんバージョンが推奨されます(コンパイラーが私のバージョンをあなたの方法で最適化するとは思わないためです)。
アレクシスピジョン

3
javac 1.8.0_45の場合、1行バージョンは2バイトコードが短いので、驚いた。もっとうるさくジェネリック医薬品とあなたは渡すことはできませんobjput、それをキャストするか、別のタイプとして、それを宣言しなくても、もちろん結果渡すremove直接作品を。
Samuel Edwin Ward

1
しかし、すべてのキーの名前を変更する方法
gstackoverflow

4
これは、ConcurrentModificationExceptionにつながります
gstackoverflow 16/07/17

19

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

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");

19
hashMap.put("New_Key", hashMap.remove("Old_Key"));

これはあなたが望むことを行いますが、キーの場所が変更されていることに気づくでしょう。


@Vinsはドキュメンテーションを喜ば再訪:D、削除()このチェック、オブジェクトを返しますtutorialspoint.com/java/util/hashmap_remove.htmを
モハメド・ザカリアエルZoghbi

1
私の悪い、私は私のコメントを削除し、それに投票しました。申し訳ありません。
Vin

9

一度追加されたハッシュマップキーの名前を変更/変更することはできません。

唯一の方法は、キーを削除/削除し、新しいキーと値のペアを挿入することです。

理由:ハッシュマップの内部実装では、ハッシュマップキー修飾子が最終としてマークされています。

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


4

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


2

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!!!");

1

以下の点を見てください:

1) No,You can not rename the key of hashmap once added.

 2) Very first you have to delete or remove that key and then you can insert with new key with value.

 3) Because in hashmap internal implementation the Hashmap key modifier  is final.

0

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

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

バイマップを使用すると、ビューを反転してキーを置き換えることができます。
Apache Commons BidiMapとGuava BiMapの両方をチェックしてください


0

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

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.