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:
+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
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:
Meskipun Anda juga bisa memiliki kunci yang tidak ada untuk mendapatkan nilai kunci yang ada dari hashmap tetapi saya khawatir itu mungkin kriminal, bagaimanapun:
publicclassKeyWrapper<T>{
private T key;
publicKeyWrapper(T key){
this.key=key;
}
@Overridepublicbooleanequals(Object o){
return hashCode()==o.hashCode();
}
@OverridepublicinthashCode(){
int hash=((String)key).length();//however you want your hash to be computed such that two different objects may share the same at some pointreturn 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!!!");
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 .
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))
);
Jawaban:
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);
sumber
map.put( "newKey", map.remove( "oldKey" ) );
dan disediakan berisioldKey
obj
keput
tanpa casting atau menyatakan sebagai jenis lain, tapi tentu saja melewati hasil dariremove
langsung bekerja.hashMap.put("New_Key", hashMap.remove("Old_Key"));
Ini akan melakukan apa yang Anda inginkan tetapi, Anda akan melihat bahwa lokasi kunci telah berubah.
sumber
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");
sumber
Anda tidak dapat mengganti nama / memodifikasi hashmap
key
setelah ditambahkan.Satu-satunya cara adalah dengan menghapus / melepas
key
dan menyisipkan dengan yang barukey
danvalue
memasangkan.Alasan : Dalam implementasi internal hashmap,
key
pengubahHashmapditandai 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
sumber
Anda tidak mengganti nama kunci hashmap, Anda harus memasukkan entri baru dengan kunci baru dan menghapus yang lama.
sumber
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!!!");
sumber
Silakan lihat poin di bawah ini:
Tidak, Anda tidak dapat mengganti nama
key
dariHashMap
setelah ditambahkan.Pertama Anda harus menghapus atau menghapus
key
dan kemudian Anda dapat menyisipkan dengan yang barukey
denganvalue
.Karena dalam
HashMap
implementasi internalHashMap
pengubah kunci adalahfinal
.sumber
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.
Dengan menggunakan bimap, Anda dapat membalik tampilan dan mengganti kuncinya.
Lihat Apache Commons BidiMap dan Guava BiMap .
sumber
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)) );
sumber