118 votes

Est-il possible de renommer une clé Hashmap ?

Je cherche un moyen de renommer une clé Hashmap, mais je ne sais pas si c'est possible en Java.

3voto

LiNKeR Points 122

Je dirais que l'essence des clés de hashmap est de permettre l'accès à l'index et rien de plus, mais voici une astuce : créer une classe key-wrapper autour de la valeur de la clé pour que l'objet key-wrapper devienne la clé de hashmap pour l'accès à l'index, de sorte que vous puissiez accéder et changer la valeur de l'objet key-wrapper pour vos besoins spécifiques :

public class KeyWrapper<T>{

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

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

}

Exemple

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

On pourrait aussi faire en sorte qu'une clé non existante puisse obtenir la valeur d'une clé existante à partir de la hashmap, mais je crains que ce ne soit criminel, de toute façon :

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

Exemple

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

1voto

Basheer AL-MOMANI Points 5565

Dans mon cas, j'avais une carte contenant des clés non réelles -> des clés réelles, j'ai donc dû remplacer les clés non réelles par des clés réelles dans ma carte (l'idée est la même que celle des autres).

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);

1voto

Ghanshyam Points 181

Veuillez consulter les points ci-dessous :

  1. Non, vous ne pouvez pas renommer le key de HashMap une fois ajouté.

  2. Tout d'abord, vous devez supprimer ou enlever cette key et ensuite vous pouvez insérer avec de nouvelles key con value .

  3. Parce que dans HashMap la mise en œuvre interne le HashMap Le modificateur de touche est final .

0voto

dorony Points 363

Vous pouvez, si au lieu du HashMap natif de Java vous utilisez un Bimap .
Il ne s'agit pas de la mise en œuvre traditionnelle de la carte, et vous devez vous assurer qu'elle répond à vos besoins.

Une bimap (ou "carte bidirectionnelle") est une carte qui préserve l'unicité de ses composantes. l'unicité de ses valeurs ainsi que celle de ses clés. Cette contrainte permet aux bimaps de prendre en charge une "vue inverse", c'est-à-dire une autre bimap contenant les mêmes entrées que ce bimap mais avec des clés et des valeurs inversées. valeurs inversées.

En utilisant une bimap, vous pouvez inverser la vue et remplacer la clé.
Vérifiez les deux Apache Commons BidiMap et Goyave BiMap .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X