ฉันกำลังหาวิธีเปลี่ยนชื่อคีย์ Hashmap แต่ไม่รู้ว่าเป็นไปได้ไหมใน Java
ฉันกำลังหาวิธีเปลี่ยนชื่อคีย์ Hashmap แต่ไม่รู้ว่าเป็นไปได้ไหมใน Java
คำตอบ:
ลองเอาองค์ประกอบออกแล้วใส่ชื่อใหม่อีกครั้ง สมมติว่ากุญแจในแผนที่ของคุณคือString
มันสามารถทำได้ด้วยวิธีนี้:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
และให้มีoldKey
obj
ไปได้put
โดยไม่ต้องแคสต์หรือประกาศว่าเป็นประเภทอื่น แต่แน่นอนว่าส่งผ่านผลremove
งานโดยตรง
hashMap.put("New_Key", hashMap.remove("Old_Key"));
สิ่งนี้จะทำในสิ่งที่คุณต้องการ แต่คุณจะสังเกตเห็นว่าตำแหน่งของคีย์เปลี่ยนไป
กำหนดค่าของคีย์ซึ่งจำเป็นต้องเปลี่ยนชื่อให้กับคีย์ใหม่ และลบคีย์เก่า.
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
คุณไม่สามารถเปลี่ยนชื่อ / แก้ไขแฮชแมปได้key
เมื่อเพิ่มแล้ว
วิธีเดียวคือการลบ / ลบkey
และแทรกใหม่key
และvalue
จับคู่
เหตุผล : ใน HashMap การดำเนินงานภายใน HashMapทำเครื่องหมายปรับปรุงเป็น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
คุณไม่ได้เปลี่ยนชื่อคีย์แฮชแมปคุณต้องแทรกรายการใหม่ด้วยคีย์ใหม่และลบคีย์เก่า
ฉันขอยืนยันว่าสาระสำคัญของคีย์ 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!!!");
โปรดดูประเด็นด้านล่าง:
ไม่คุณไม่สามารถเปลี่ยนชื่อkey
ของที่HashMap
เพิ่มครั้งเดียวได้
ครั้งแรกที่คุณจะต้องลบหรือลบที่key
แล้วคุณสามารถแทรกใหม่ด้วยkey
value
เพราะในHashMap
การดำเนินงานภายในปรับปรุงที่สำคัญคือHashMap
final
คุณสามารถถ้าแทนชวา HashMap พื้นเมืองของคุณจะใช้Bimap
ไม่ใช่การใช้งานแผนที่แบบเดิมและคุณต้องแน่ใจว่าเหมาะสมกับความต้องการของคุณ
bimap (หรือ "แผนที่สองทิศทาง") คือแผนที่ที่รักษาความเป็นเอกลักษณ์ของค่าต่างๆรวมทั้งคีย์ต่างๆ ข้อ จำกัด นี้ทำให้ bimaps รองรับ "มุมมองผกผัน" ซึ่งเป็น bimap อื่นที่มีรายการเดียวกันกับ bimap นี้ แต่มีคีย์และค่าที่กลับด้าน
ใช้ bimap คุณสามารถผกผันมุมมองและแทนที่คีย์ได้
กร้าทั้ง Apache Commons BidiMapและฝรั่งBiMap
ในกรณีของฉันมีแผนที่ที่ไม่มีคีย์จริง -> คีย์จริงดังนั้นฉันจึงต้องแทนที่ไม่ใช่เรียลด้วยเรียลในแผนที่ของฉัน (ความคิดก็เหมือนกับคนอื่น ๆ )
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);