Apakah mungkin untuk mengganti nama kunci Hashmap?

92

Saya mencari cara untuk mengganti nama kunci Hashmap, tetapi saya tidak tahu apakah itu mungkin di Java.

Ikes
sumber
11
Astaga, kuharap tidak. Menghapus dan memasukkan kembali pasangan kunci / nilai sepertinya merupakan cara yang harus dilakukan. Perhatikan bahwa Anda biasanya hanya menangani referensi di peta itu sendiri.
Maarten Bodewes
4
Harap jangan mengubah kunci entri hash! Jika Anda beruntung, Anda akan mengubahnya menjadi sesuatu dengan kode hash yang sama dan Anda akan menjadi agak gila mencoba mencari tahu apa yang terjadi; jika Anda tidak beruntung, Anda akan mendapatkan entri yang tidak dapat ditemukan (yah, tidak sampai seluruh tabel dibangun kembali). Hapus / reinsert jauh lebih waras, dan seharusnya cukup murah (bagaimanapun juga itu semua referensi).
Donal Fellows

Jawaban:

140

Coba hapus elemen tersebut dan taruh lagi dengan nama baru. Dengan asumsi kunci di peta Anda adalah String, itu dapat dilakukan dengan cara itu:

Object obj = map.remove("oldKey");
map.put("newKey", obj);
Alexis Pigeon
sumber
61
+1. Dan yang paling sederhana untuk dibaca adalah map.put( "newKey", map.remove( "oldKey" ) );dan disediakan berisioldKey
Ravinder Reddy
15
Sejauh menyangkut keterbacaan, saya cukup tidak setuju, secara pribadi saya lebih suka melihat dengan jelas bahwa suatu objek dihapus dari peta, dan kemudian ditambahkan. Dan karena OP tampaknya cukup baru di Java, saya memutuskan untuk menjelaskannya seperti itu. Demi kinerja bagaimanapun, versi Anda tentu saja lebih disukai (karena saya tidak berpikir kompilator akan mengoptimalkan versi saya dengan cara Anda).
Alexis Pigeon
3
Untuk javac 1.8.0_45, versi satu baris adalah dua bytecode lebih pendek, yang mengejutkan saya. Lebih mengganggu dengan obat generik Anda tidak bisa lewat objke puttanpa casting atau menyatakan sebagai jenis lain, tapi tentu saja melewati hasil dari removelangsung bekerja.
Samuel Edwin Ward
1
Tetapi cara mengganti nama semua kunci
gstackoverflow
4
Ini akan mengarah ke ConcurrentModificationException
gstackoverflow
20
hashMap.put("New_Key", hashMap.remove("Old_Key"));

Ini akan melakukan apa yang Anda inginkan tetapi, Anda akan melihat bahwa lokasi kunci telah berubah.

Mohamed Zakaria El-Zoghbi
sumber
@Vins mengunjungi kembali dokumentasinya: D, remove () akan mengembalikan objek, periksa tutorialspoint.com/java/util/hashmap_remove.htm
Mohamed Zakaria El-Zoghbi
1
saya buruk, saya telah menghapus komentar saya dan memilihnya. Maaf soal itu.
Vins
19

Tetapkan nilai kunci, yang perlu diganti namanya, ke kunci baru. Dan hapus kunci lama.

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
Deepak Mani
sumber
10

Anda tidak dapat mengganti nama / memodifikasi hashmap keysetelah ditambahkan.

Satu-satunya cara adalah dengan menghapus / melepas keydan menyisipkan dengan yang baru keydan valuememasangkan.

Alasan : Dalam implementasi internal hashmap,keypengubahHashmapditandai sebagaifinal.

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
}

Untuk Referensi: HashMap

sinar cahaya
sumber
ini adalah jawaban terbaik menurut saya karena tidak mungkin mengganti nama kunci.
Wolfson
4

Anda tidak mengganti nama kunci hashmap, Anda harus memasukkan entri baru dengan kunci baru dan menghapus yang lama.

Hari Menon
sumber
2

Saya berpendapat bahwa esensi kunci hasmap adalah untuk tujuan akses indeks dan tidak lebih dari itu, tetapi inilah retasannya: membuat kelas pembungkus kunci di sekitar nilai kunci sehingga objek pembungkus kunci menjadi kunci hashmap untuk akses indeks, jadi Anda dapat mengakses dan mengubah nilai objek key-wrapper untuk kebutuhan spesifik Anda:

public class KeyWrapper<T>{

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

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

}

Contoh

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

Meskipun Anda juga bisa memiliki kunci yang tidak ada untuk mendapatkan nilai kunci yang ada dari hashmap tetapi saya khawatir itu mungkin kriminal, bagaimanapun:

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;
        }
    }

Contoh

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

Silakan lihat poin di bawah ini:

  1. Tidak, Anda tidak dapat mengganti nama keydari HashMapsetelah ditambahkan.

  2. Pertama Anda harus menghapus atau menghapus keydan kemudian Anda dapat menyisipkan dengan yang baru keydengan value.

  3. Karena dalam HashMapimplementasi internal HashMappengubah kunci adalah final.

Ghanshyam
sumber
0

Anda bisa, jika alih-alih HashMap asli Java, Anda akan menggunakan Bimap .
Ini bukan penerapan Peta tradisional, dan Anda perlu memastikannya sesuai dengan kebutuhan Anda.

Bimap (atau "peta dua arah") adalah peta yang mempertahankan keunikan nilainya dan juga kunci-kuncinya. Batasan ini memungkinkan bimaps untuk mendukung "tampilan terbalik", yang merupakan bimap lain yang berisi entri yang sama seperti bimap ini tetapi dengan kunci dan nilai yang dibalik.

Dengan menggunakan bimap, Anda dapat membalik tampilan dan mengganti kuncinya.
Lihat Apache Commons BidiMap dan Guava BiMap .

Dorony
sumber
0

Dalam kasus saya memiliki peta yang tidak berisi kunci nyata -> kunci nyata, jadi saya harus mengganti yang tidak nyata dengan yang nyata di peta saya (idenya seperti yang lain)

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
Basheer AL-MOMANI
sumber