Szukam sposobu na zmianę nazwy klucza Hashmap, ale nie wiem, czy jest to możliwe w Javie.
Szukam sposobu na zmianę nazwy klucza Hashmap, ale nie wiem, czy jest to możliwe w Javie.
Odpowiedzi:
Spróbuj usunąć element i umieść go ponownie z nową nazwą. Zakładając, że klucze na twojej mapie są String
, można to osiągnąć w ten sposób:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
i zawieraoldKey
obj
do put
bez rzucania go lub deklarując je jako inny typ, ale oczywiście przechodząc wyniku remove
działa bezpośrednio.
hashMap.put("New_Key", hashMap.remove("Old_Key"));
Zrobi to, co chcesz, ale zauważysz, że lokalizacja klucza się zmieniła.
Przypisz wartość klucza, którego nazwę należy zmienić, do nowego klucza. I wyjmij stary klucz.
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
key
Po dodaniu nie można zmienić nazwy ani zmodyfikować mapy hasma .
Jedynym sposobem jest usunięcie / usunięcie key
i włożenie nowego key
i value
parowania.
Powód : w wewnętrznej implementacji hashmapkey
modyfikatorHashmapoznaczony jakofinal
.
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
}
Dla odniesienia: HashMap
Nie zmieniasz nazwy klucza hashmap, musisz wstawić nowy wpis z nowym kluczem i usunąć stary.
Twierdzę, że istota kluczy hasmap służy do celów dostępu do indeksów i nic więcej, ale oto hack: tworzenie klasy opakowującej klucz wokół wartości klucza, aby obiekt opakowujący klucz stał się kluczem hashmap do dostępu do indeksu, więc ty może uzyskać dostęp i zmienić wartość obiektu opakowującego klucz zgodnie z określonymi potrzebami:
public class KeyWrapper<T>{
private T key;
public KeyWrapper(T key){
this.key=key;
}
public void rename(T newkey){
this.key=newkey;
}
}
Przykład
HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper key=new KeyWrapper("cool-key");
hashmap.put(key,"value");
key.rename("cool-key-renamed");
Chociaż możesz również mieć nieistniejący klucz, aby uzyskać wartość istniejącego klucza z haszmapy, ale obawiam się, że może to być przestępstwo, tak czy inaczej:
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;
}
}
Przykład
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!!!");
Możesz, jeśli zamiast natywnej Java HashMap użyjesz Bimap .
To nie jest tradycyjna implementacja Map i musisz się upewnić, że odpowiada Twoim potrzebom.
Bimapa (lub „mapa dwukierunkowa”) to mapa, która zachowuje niepowtarzalność swoich wartości, a także kluczy. To ograniczenie umożliwia elementom bimap obsługę „widoku odwróconego”, czyli kolejnej bimapy zawierającej te same wpisy co ta bimapa, ale z odwróconymi kluczami i wartościami.
Używając bimap, możesz odwrócić widok i zamienić klucz. Sprawdź
zarówno Apache Commons BidiMap, jak i Guava BiMap .
W moim przypadku miałem mapę zawierającą nie prawdziwy klucz -> prawdziwe klucze, więc musiałem zamienić nie rzeczywiste na rzeczywiste w mojej mapie (pomysł jest jak inne)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);