Hashmap anahtarını yeniden adlandırmanın bir yolunu arıyorum, ancak bunun Java'da mümkün olup olmadığını bilmiyorum.
Hashmap anahtarını yeniden adlandırmanın bir yolunu arıyorum, ancak bunun Java'da mümkün olup olmadığını bilmiyorum.
Yanıtlar:
Öğeyi kaldırmayı ve yeni adla yeniden koymayı deneyin. Haritanızdaki anahtarların olduğunu varsayarsak, String
şu şekilde başarılabilir:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
içerir ve sağlanıroldKey
obj
için put
bunu döküm veya başka türü olarak deklare etmeden, ama tabii ki sonucu geçen remove
doğrudan çalışır.
hashMap.put("New_Key", hashMap.remove("Old_Key"));
Bu istediğinizi yapacak ancak anahtarın yerinin değiştiğini fark edeceksiniz.
Yeniden adlandırılması gereken anahtarın değerini yeni bir anahtara atayın. Ve eski anahtarı çıkarın.
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
Eklendikten key
sonra hashmap'i yeniden adlandıramaz / değiştiremezsiniz .
Tek yol, silmek / çıkarmak key
ve yenisi key
ve value
çift ile eklemek .
Sebep : Hashmap dahili uygulamasında Hashmapkey
değiştiricisi olarak işaretlenmiş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
}
Referans için: HashMap
Bir hashmap anahtarını yeniden adlandırmazsınız, yeni anahtarla yeni bir giriş eklemeniz ve eskisini silmeniz gerekir.
Hashmap anahtarlarının özünün indeks erişim amaçları için olduğunu ve başka bir şey olmadığını iddia ediyorum ama burada bir hack var: anahtar sarmalayıcı nesnesi indeks erişimi için hashmap anahtarı haline gelecek şekilde anahtarın değeri etrafında bir anahtar sarmalayıcı sınıfı yapmak, yani özel ihtiyaçlarınız için anahtar sarmalayıcı nesnesinin değerine erişebilir ve bunları değiştirebilir:
public class KeyWrapper<T>{
private T key;
public KeyWrapper(T key){
this.key=key;
}
public void rename(T newkey){
this.key=newkey;
}
}
Misal
HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper key=new KeyWrapper("cool-key");
hashmap.put(key,"value");
key.rename("cool-key-renamed");
Var olmayan bir anahtara da sahip olsanız da, hashmap'ten mevcut bir anahtarın değerini alabilmeniz için, yine de bunun suç olabileceğinden korkuyorum:
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;
}
}
Misal
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!!!");
Java yerel HashMap yerine bir Bimap kullanacaksanız, yapabilirsiniz .
Bu geleneksel Harita uygulaması değildir ve ihtiyaçlarınıza uygun olduğundan emin olmanız gerekir.
Bir bimap (veya "çift yönlü harita"), değerlerinin ve anahtarlarının benzersizliğini koruyan bir haritadır. Bu kısıtlama, bimap'lerin, bu bimap ile aynı girdileri içeren ancak tersine çevrilmiş anahtarlar ve değerlere sahip başka bir bimap olan "ters görünümü" desteklemesini sağlar.
Bir bimap kullanarak görünümü tersine çevirebilir ve anahtarı değiştirebilirsiniz.
Hem Apache Commons BidiMap hem de Guava BiMap'e göz atın .
Benim durumumda gerçek anahtar içermeyen bir harita vardı -> gerçek anahtarlar, bu yüzden gerçek olmayanları haritamdaki gerçeklerle değiştirmek zorunda kaldım (fikir diğerleri gibi)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);