È possibile rinominare una chiave Hashmap?


89

Sto cercando un modo per rinominare una chiave Hashmap, ma non so se sia possibile in Java.


11
Accidenti, spero di no. Eliminare e reinserire la coppia chiave / valore sembra la strada da percorrere. Nota che normalmente gestisci comunque i riferimenti nella mappa stessa.
Maarten Bodewes

4
Si prega di non modificare la chiave di una voce hash! Se sei fortunato, lo cambierai con qualcosa con lo stesso codice hash e diventerai un po 'matto cercando di capire cosa è successo; se sei sfortunato, ti ritroverai con una voce che non può essere trovata (beh, non fino alla prossima ricostruzione dell'intera tabella). Rimuovere / reinserire è molto più sano e dovrebbe essere piuttosto economico (dopotutto sono tutti riferimenti).
Donal Fellows

Risposte:


137

Prova a rimuovere l'elemento e rimettilo con il nuovo nome. Supponendo che le chiavi nella tua mappa siano String, potrebbe essere ottenuto in questo modo:

Object obj = map.remove("oldKey");
map.put("newKey", obj);

59
+1. E il più semplice da leggere è map.put( "newKey", map.remove( "oldKey" ) );e fornito contieneoldKey
Ravinder Reddy,

15
Per quanto riguarda la leggibilità, sono piuttosto in disaccordo, personalmente preferisco vedere chiaramente che un oggetto viene rimosso dalla mappa e quindi aggiunto. E poiché l'OP sembra essere abbastanza nuovo per Java, ho deciso di metterlo in questo modo. Per motivi di prestazioni, tuttavia, la tua versione è ovviamente preferita (poiché non credo che il compilatore ottimizzerà la mia versione a modo tuo).
Alexis Pigeon

3
Per javac 1.8.0_45, la versione a una riga è più corta di due bytecode, il che mi ha sorpreso. Più fastidiosamente con i generici non è possibile passare obja putsenza fusione o dichiarandola come un altro tipo, ma naturalmente passando il risultato di removeopere direttamente.
Samuel Edwin Ward,

1
Ma come rinominare tutte le chiavi
gstackoverflow


19

Assegna il valore della chiave, che deve essere rinominata, a una nuova chiave. E rimuovi la vecchia chiave.

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");


9

Non è possibile rinominare / modificare la chiave hashmap una volta aggiunta.

L'unico modo è eliminare / rimuovere la chiave e inserirla con una nuova coppia chiave e valore.

Motivo : nell'implementazione interna di hashmap il modificatore della chiave Hashmap contrassegnato come finale.

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
}

Per riferimento: HashMap


4

Non si rinomina una chiave hashmap, è necessario inserire una nuova voce con la nuova chiave ed eliminare quella vecchia.


2

Direi che l'essenza delle chiavi hasmap sono per scopi di accesso all'indice e nient'altro, ma ecco un trucco: creare una classe key-wrapper attorno al valore della chiave in modo che l'oggetto key-wrapper diventi la chiave hashmap per l'accesso all'indice, quindi tu può accedere e modificare il valore dell'oggetto key-wrapper per le tue esigenze specifiche:

public class KeyWrapper<T>{

      private T key;
      public KeyWrapper(T key){
         this.key=key;
       }

      public void rename(T newkey){
              this.key=newkey;
       }

}

Esempio

   HashMap<KeyWrapper,String> hashmap=new HashMap<>();
   KeyWrapper key=new KeyWrapper("cool-key");
   hashmap.put(key,"value");
   key.rename("cool-key-renamed");

Anche se potresti anche avere una chiave non esistente in grado di ottenere il valore di una chiave esistente dalla hashmap, ma temo che possa essere criminale, comunque:

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;
        }
    }

Esempio

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

1

Si prega di guardare i punti seguenti:

1) No,You can not rename the key of hashmap once added.

 2) Very first you have to delete or remove that key and then you can insert with new key with value.

 3) Because in hashmap internal implementation the Hashmap key modifier  is final.

0

Puoi, se invece di HashMap nativo di Java utilizzerai una Bimap .
Non è l'implementazione tradizionale di Map e devi assicurarti che sia adatta alle tue esigenze.

Una bimap (o "mappa bidirezionale") è una mappa che conserva l'unicità dei suoi valori così come quella delle sue chiavi. Questo vincolo consente a bimap di supportare una "vista inversa", che è un altro bimap contenente le stesse voci di questo bimap ma con chiavi e valori invertiti.

Utilizzando un bimap, puoi invertire la visualizzazione e sostituire la chiave. Controlla
sia Apache Commons BidiMap che Guava BiMap .


0

Nel mio caso avevo una mappa contenente una chiave non reale -> chiavi reali, quindi ho dovuto sostituire i non reali con i reali nella mia mappa (l'idea è come le altre)

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.