¿Es posible cambiar el nombre de una clave Hashmap?

92

Estoy buscando una forma de cambiar el nombre de una clave Hashmap, pero no sé si es posible en Java.

Ikes
fuente
11
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:

Object obj = map.remove("oldKey");
map.put("newKey", obj);
Alexis paloma
fuente
61
+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.
Samuel Edwin Ward
1
Pero cómo cambiar el nombre de todas las claves
gstackoverflow
4
Conducirá a ConcurrentModificationException
gstackoverflow
20
hashMap.put("New_Key", hashMap.remove("Old_Key"));

Esto hará lo que desee, pero notará que la ubicación de la clave ha cambiado.

Mohamed Zakaria El-Zoghbi
fuente
@Vins revise la documentación, por favor: D, remove () devolverá el objeto, revise este tutorialspoint.com/java/util/hashmap_remove.htm
Mohamed Zakaria El-Zoghbi
1
mi mal, he eliminado mi comentario y votado a favor. Lo siento por eso.
Vins
19

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");
Deepak Mani
fuente
10

No puede cambiar el nombre / modificar el mapa de hash key una vez agregado.

La única forma es eliminar / eliminar keye insertar con nuevo keyy valueemparejar.

Razón : En la implementación interna de hashmap, elkeymodificadorHashmapmarcado 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

rayo de luz
fuente
esta es la mejor respuesta en mi opinión, ya que no es posible cambiar el nombre de una clave.
Wolfson
4

No cambia el nombre de una clave hashmap, tiene que insertar una nueva entrada con la nueva clave y eliminar la anterior.

Hari Menon
fuente
2

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!!!");
ENLACE
fuente
1

Por favor mire a continuación los puntos:

  1. No, no se puede cambiar el nombre keyde HashMapuna vez agregado.

  2. Primero tienes que borrar o quitar eso keyy luego puedes insertar con nuevo keycon value.

  3. Porque en HashMapla implementación interna el HashMapmodificador de clave es final.

Ghanshyam
fuente
0

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 .

Dorony
fuente
0

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))
);
Basheer AL-MOMANI
fuente