Estoy buscando una forma de cambiar el nombre de una clave Hashmap, pero no sé si es posible en Java.
Estoy buscando una forma de cambiar el nombre de una clave Hashmap, pero no sé si es posible en Java.
Respuestas:
Intente eliminar el elemento y vuelva a ponerlo con el nuevo nombre. Suponiendo que las claves en su mapa son String
, podría lograrse de esa manera:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
que contieneoldKey
obj
a put
sin poner o declarándola como otro tipo, pero por supuesto pasando el resultado de remove
las obras directamente.
hashMap.put("New_Key", hashMap.remove("Old_Key"));
Esto hará lo que desee, pero notará que la ubicación de la clave ha cambiado.
Asigne el valor de la clave, que necesita cambiar de nombre, a una nueva clave. Y quita la llave vieja.
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
No puede cambiar el nombre / modificar el mapa de hash key
una vez agregado.
La única forma es eliminar / eliminar key
e insertar con nuevo key
y value
emparejar.
Razón : En la implementación interna de hashmap, elkey
modificadorHashmapmarcado comofinal
.
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
}
Para referencia: HashMap
No cambia el nombre de una clave hashmap, tiene que insertar una nueva entrada con la nueva clave y eliminar la anterior.
Yo diría que la esencia de las claves de hasmap son para fines de acceso al índice y nada más, pero aquí hay un truco: hacer una clase de envoltura de clave alrededor del valor de la clave para que el objeto de envoltura de clave se convierta en la clave de mapa de hash para el acceso al índice, por lo que puede acceder y cambiar el valor del objeto key-wrapper para sus necesidades específicas:
public class KeyWrapper<T>{
private T key;
public KeyWrapper(T key){
this.key=key;
}
public void rename(T newkey){
this.key=newkey;
}
}
Ejemplo
HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper key=new KeyWrapper("cool-key");
hashmap.put(key,"value");
key.rename("cool-key-renamed");
Aunque también podría tener una clave no existente para obtener el valor de una clave existente del mapa de hash, pero me temo que podría ser criminal, de todos modos:
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;
}
}
Ejemplo
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!!!");
Puede, si en lugar de HashMap nativo de Java usará un Bimap .
No es la implementación tradicional de Map y debe asegurarse de que se adapte a sus necesidades.
Un bimap (o "mapa bidireccional") es un mapa que conserva la singularidad de sus valores así como la de sus claves. Esta restricción permite que los bimapas admitan una "vista inversa", que es otro bimapa que contiene las mismas entradas que este bimapa pero con claves y valores invertidos.
Con un bimapa, puede invertir la vista y reemplazar la clave. Consulte
tanto Apache Commons BidiMap como Guava BiMap .
En mi caso, tenía un mapa que contenía una clave no real -> claves reales, por lo que tuve que reemplazar las no reales con las reales en mi mapa (la idea es como otras)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);