Sto cercando un modo per rinominare una chiave Hashmap, ma non so se sia possibile in Java.
Sto cercando un modo per rinominare una chiave Hashmap, ma non so se sia possibile in Java.
Risposte:
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);
map.put( "newKey", map.remove( "oldKey" ) );e fornito contieneoldKey
obja putsenza fusione o dichiarandola come un altro tipo, ma naturalmente passando il risultato di removeopere direttamente.
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");
hashMap.put("New_Key", hashMap.remove("Old_Key"));
Questo farà quello che vuoi ma noterai che la posizione della chiave è cambiata.
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
Non si rinomina una chiave hashmap, è necessario inserire una nuova voce con la nuova chiave ed eliminare quella vecchia.
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!!!");
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 .
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))
);