Saya mencari cara untuk mengganti nama kunci Hashmap, tetapi saya tidak tahu apakah itu mungkin di Java.
Saya mencari cara untuk mengganti nama kunci Hashmap, tetapi saya tidak tahu apakah itu mungkin di Java.
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);
map.put( "newKey", map.remove( "oldKey" ) );dan disediakan berisioldKey
objke puttanpa casting atau menyatakan sebagai jenis lain, tapi tentu saja melewati hasil dari removelangsung 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.
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");
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
Anda tidak mengganti nama kunci hashmap, Anda harus memasukkan entri baru dengan kunci baru dan menghapus yang lama.
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!!!");
Silakan lihat poin di bawah ini:
Tidak, Anda tidak dapat mengganti nama keydari HashMapsetelah ditambahkan.
Pertama Anda harus menghapus atau menghapus keydan kemudian Anda dapat menyisipkan dengan yang baru keydengan value.
Karena dalam HashMapimplementasi internal HashMappengubah kunci adalah final.
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))
);