Dios, espero que no. Eliminar y volver a ingresar el par clave / valor parece ser el camino a seguir. Tenga en cuenta que normalmente solo maneja las referencias en el mapa en sí.
Maarten Bodewes
4
¡No modifique la clave de una entrada hash! Si tiene suerte, lo cambiará a algo con el mismo código hash y se volverá un poco loco tratando de averiguar qué sucedió; si no tiene suerte, terminará con una entrada que no se puede encontrar (bueno, no hasta la próxima reconstrucción de toda la tabla). Eliminar / reinsertar es mucho más sensato y debería ser bastante barato (después de todo, todas son referencias).
Donal Fellows
Respuestas:
140
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:
+1. Y lo más simple de leer es map.put( "newKey", map.remove( "oldKey" ) );que contieneoldKey
Ravinder Reddy
15
En lo que respecta a la legibilidad, no estoy de acuerdo, personalmente prefiero ver claramente que un objeto se elimina del mapa y luego se agrega. Y dado que el OP parece ser bastante nuevo en Java, decidí ponerlo de esa manera. Sin embargo, en aras del rendimiento, por supuesto, se prefiere su versión (ya que no creo que el compilador optimice mi versión a su manera).
Alexis Pigeon
3
Para javac 1.8.0_45, la versión de una línea es dos códigos de bytes más corta, lo que me sorprendió. Más molesto con los genéricos no se puede pasar obja putsin poner o declarándola como otro tipo, pero por supuesto pasando el resultado de removelas obras directamente.
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:
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:
publicclassKeyWrapper<T>{
private T key;
publicKeyWrapper(T key){
this.key=key;
}
@Overridepublicbooleanequals(Object o){
return hashCode()==o.hashCode();
}
@OverridepublicinthashCode(){
int hash=((String)key).length();//however you want your hash to be computed such that two different objects may share the same at some pointreturn 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))
);
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);
fuente
map.put( "newKey", map.remove( "oldKey" ) );
que contieneoldKey
obj
aput
sin poner o declarándola como otro tipo, pero por supuesto pasando el resultado deremove
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.
fuente
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");
fuente
No puede cambiar el nombre / modificar el mapa de hash
key
una vez agregado.La única forma es eliminar / eliminar
key
e insertar con nuevokey
yvalue
emparejar.Razón : En la implementación interna de hashmap, el
key
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
fuente
No cambia el nombre de una clave hashmap, tiene que insertar una nueva entrada con la nueva clave y eliminar la anterior.
fuente
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!!!");
fuente
Por favor mire a continuación los puntos:
No, no se puede cambiar el nombre
key
deHashMap
una vez agregado.Primero tienes que borrar o quitar eso
key
y luego puedes insertar con nuevokey
convalue
.Porque en
HashMap
la implementación interna elHashMap
modificador de clave esfinal
.fuente
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.
Con un bimapa, puede invertir la vista y reemplazar la clave. Consulte
tanto Apache Commons BidiMap como Guava BiMap .
fuente
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)) );
fuente