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".
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.
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
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 :)