web-dev-qa-db-fra.com

Obtenir une énumération (pour les clés) d'une carte (HashMap) en Java?

Autant que je sache, il semble qu’il n’existe pas de moyen direct d’obtenir un Enumeration directement pour les clés d’un HashMap. Je ne peux obtenir qu'un keySet(). À partir de cette Set, je peux obtenir une Iterator mais une Iterator semble être quelque chose de différent d'un Enumeration.

Quel est le meilleur moyen et le plus performant d’obtenir directement une Enumeration à partir des touches d’un HashMap?

Arrière-plan: J'implémente ma propre méthode ResourceBundle (=> getKeys()) et je dois fournir/implémenter une méthode qui renvoie l'énumération de toutes les clés. Mais comme mon implémentation est basée sur une HashMap, je dois donc trouver le moyen de convertir au mieux ces deux techniques "Iterator/Enumerator".

19
tim

Apache commons-collections possède un adaptateur qui rend la Iterator disponible comme une Enumeration. Jetez un oeil à IteratorEnumeration .

Adaptateur permettant de faire apparaître une instance Iterator comme une instance d'énumération

En bref, vous procédez comme suit:

Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator());

Sinon, si vous (pour une raison quelconque) ne souhaitez pas inclure de collections communes, vous pouvez implémenter cet adaptateur vous-même. C’est simple: il suffit d’implémenter Enumeration, de transmettre Iterator dans un constructeur, et chaque fois que hasMoreElements() et nextElement() sont appelés, appelez hasNext() et next() sur la Iterator sous-jacente.

Utilisez ceci si vous êtes obligé d'utiliser Enumeration par un contrat d'API (comme je suppose que c'est le cas). Sinon, utilisez Iterator - c'est l'option recommandée.

21
Bozho

Je pense que vous pouvez utiliser la méthode énumération de Java.util.Collections classe pour atteindre ce que vous voulez.

La documentation API de la méthode énumérée a ceci à dire:

énumération statique publique énumération (Collection c)
Renvoie une énumération de la collection spécifiée. Cela permet une interopérabilité avec les API héritées nécessitant une énumération en entrée.

Par exemple, l'extrait de code ci-dessous obtient une instance d'énumération à partir du jeu de clés de HashMap.

 final Map <String,Integer> test = new HashMap<String,Integer>();
 test.put("one",1);
 test.put("two",2);
 test.put("three",3);
 final Enumeration<String> strEnum = Collections.enumeration(test.keySet());
 while(strEnum.hasMoreElements()) {
     System.out.println(strEnum.nextElement());
 }

et le résultat obtenu est:
un
deux
Trois

37
sateesh

Vous pouvez écrire un adaptateur pour vous adapter à Énumération.

    public class MyEnumeration implements Enumeration {

        private Iterator iterator;

        public MyEnumeration(Iterator iterator){
            this.iterator = iterator;
        }


        public MyEnumeration(Map map) {
            iterator = map.keySet().iterator();
        }


        @Override
        public boolean hasMoreElements() {
            return iterator.hasNext();
        }


        @Override
        public Object nextElement() {
            return iterator.next();
        }

    }

Et ensuite, vous pouvez utiliser cette énumération personnalisée :)

0
richa_v