Je cherche un moyen de renommer une clé Hashmap, mais je ne sais pas si c'est possible en Java.
Je cherche un moyen de renommer une clé Hashmap, mais je ne sais pas si c'est possible en Java.
Réponses:
Essayez de supprimer l'élément et de le remettre avec le nouveau nom. En supposant que les clés de votre carte le sont String
, cela pourrait être réalisé de cette façon:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
et contientoldKey
obj
à put
sans le lancer ou le déclarer comme un autre type, mais bien sûr, passer le résultat de remove
fonctionne directement.
Attribuez la valeur de la clé, qui doit être renommée, à une nouvelle clé. Et retirez l'ancienne clé.
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
hashMap.put("New_Key", hashMap.remove("Old_Key"));
Cela fera ce que vous voulez, mais vous remarquerez que l'emplacement de la clé a changé.
Vous ne pouvez pas renommer / modifier la clé hashmap fois ajoutée.
Le seul moyen est de supprimer / supprimer la clé et de l'insérer avec une nouvelle paire clé et valeur.
Raison : dans l'implémentation interne de hashmap, le modificateur de touche Hashmap marqué comme 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
}
Pour référence: HashMap
Vous ne renommez pas une clé hashmap, vous devez insérer une nouvelle entrée avec la nouvelle clé et supprimer l'ancienne.
Je dirais que l'essence des clés hasmap sont à des fins d'accès à l'index et rien de plus, mais voici un hack: créer une classe de wrapper de clé autour de la valeur de la clé afin que l'objet key-wrapper devienne la clé de hashmap pour l'accès à l'index, donc vous peut accéder et modifier la valeur de l'objet key-wrapper pour vos besoins spécifiques:
public class KeyWrapper<T>{
private T key;
public KeyWrapper(T key){
this.key=key;
}
public void rename(T newkey){
this.key=newkey;
}
}
Exemple
HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper key=new KeyWrapper("cool-key");
hashmap.put(key,"value");
key.rename("cool-key-renamed");
Bien que vous puissiez également avoir une clé non existante être en mesure d'obtenir la valeur d'une clé existante à partir de la hashmap, mais je crains que cela puisse être criminel, de toute façon:
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;
}
}
Exemple
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!!!");
Vous pouvez, si au lieu de Java HashMap natif, vous utiliserez un Bimap .
Ce n'est pas l'implémentation traditionnelle de Map, et vous devez vous assurer qu'elle répond à vos besoins.
Un bimap (ou "bidirectional map") est une carte qui préserve l'unicité de ses valeurs ainsi que celle de ses clés. Cette contrainte permet aux bimaps de prendre en charge une «vue inverse», qui est une autre bimap contenant les mêmes entrées que cette bimap mais avec des clés et des valeurs inversées.
À l'aide d'un bimap, vous pouvez inverser la vue et remplacer la clé. Découvrez
Apache Commons BidiMap et Guava BiMap .
Dans mon cas, il y avait une carte contenant des clés non réelles -> des clés réelles, j'ai donc dû remplacer les non réels par les réels de ma carte (l'idée est comme les autres)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);