Estou procurando uma maneira de renomear uma chave Hashmap, mas não sei se é possível em Java.
Estou procurando uma maneira de renomear uma chave Hashmap, mas não sei se é possível em Java.
Respostas:
Tente remover o elemento e colocá-lo novamente com o novo nome. Supondo que as chaves em seu mapa sejam String
, isso poderia ser alcançado desta forma:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
e contémoldKey
obj
para put
sem lançar-la ou declará-la como um outro tipo, mas é claro passando o resultado do remove
trabalha diretamente.
Atribua o valor da chave, que precisa ser renomeada, a uma nova chave. E remova a chave antiga.
hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");
hashMap.put("New_Key", hashMap.remove("Old_Key"));
Isso fará o que você quiser, mas você notará que a localização da chave mudou.
Você não pode renomear / modificar a chave hashmap depois de adicionada.
A única maneira é excluir / remover a chave e inseri-la com um novo par de chave e valor.
Motivo : Na implementação interna do hashmap, o modificador de chave do Hashmap marcado como final.
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 referência: HashMap
Você não renomeia uma chave hashmap, você tem que inserir uma nova entrada com a nova chave e deletar a antiga.
Eu diria que a essência das chaves hasmap são para fins de acesso ao índice e nada mais, mas aqui está um hack: fazer uma classe de key-wrapper em torno do valor da chave para que o objeto key-wrapper se torne a chave de hashmap para acesso ao índice, pode acessar e alterar o valor do objeto key-wrapper para suas necessidades específicas:
public class KeyWrapper<T>{
private T key;
public KeyWrapper(T key){
this.key=key;
}
public void rename(T newkey){
this.key=newkey;
}
}
Exemplo
HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper key=new KeyWrapper("cool-key");
hashmap.put(key,"value");
key.rename("cool-key-renamed");
Embora você também possa ter uma chave inexistente para obter o valor de uma chave existente do hashmap, temo que isso possa ser criminoso, de qualquer maneira:
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;
}
}
Exemplo
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!!!");
Você pode, se em vez de HashMap nativo de Java você usar um Bimap .
Não é a implementação tradicional do Map e você precisa ter certeza de que atende às suas necessidades.
Um bimapa (ou "mapa bidirecional") é um mapa que preserva a exclusividade de seus valores e também de suas chaves. Essa restrição permite que os bimapas suportem uma "visão inversa", que é outro bimapa contendo as mesmas entradas deste bimapa, mas com chaves e valores invertidos.
Usando um bimapa, você pode inverter a visualização e substituir a chave. Verifique o
Apache Commons BidiMap e o Guava BiMap .
No meu caso, tinha um mapa contendo chaves não reais -> chaves reais, então tive que substituir as chaves não reais pelas reais em meu mapa (a ideia é como as outras)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);