在Java中获取地图(HashMap)的枚举(用于键)?

tim*_*tim 20 java enumeration

据我所知,似乎没有直接获得一个Enumeration关键字的直接方法HashMap.我只能得到一个keySet().从那以后Set,我可以得到一个,IteratorIterator似乎是一个不同的东西Enumeration.

什么是最好和最高效的方式直接从一个Enumeration关键的HashMap

背景:我正在实现自己的ResourceBundle(=> getKeys()Method),我必须提供/实现一个返回所有Keys的Enumeration的方法.但我的实现是基于一个HashMap所以我需要以某种方式弄清楚如何最好地转换这两个"迭代器/枚举器"技术.

sat*_*esh 42

我想你可以使用的方法枚举java.util.Collections中的类来实现你想要什么.

方法枚举的API doc有这样的说法:

public static Enumeration enumeration(Collection c)
返回指定collection的枚举.这提供了与需要枚举作为输入的旧API的互操作性.

例如,下面的代码片段从HashMap的键集中获取Enumeration的实例

 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());
 }
Run Code Online (Sandbox Code Playgroud)

和产生的输出是:
一个
2
3


Boz*_*zho 21

Apache commons-collections有一个适配器,可以Iterator像使用一样使用Enumeration.看看IteratorEnumeration.

用于创建Iterator实例的适配器似乎是Enumeration实例

简而言之,您可以执行以下操作:

Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator());
Run Code Online (Sandbox Code Playgroud)

或者,如果您(由于某种原因)不想包含commons-collections,则可以自己实现此适配器.这是很容易-只是做的实现Enumeration,通过Iterator在构造函数中,每当hasMoreElements()nextElement()被调用,调用hasNext()next()对底层Iterator.

如果您被Enumeration某些API合同强制使用(我认为是这样),请使用此选项.否则使用Iterator- 这是推荐的选项.

  • Google Collections也支持使用`Iterators.asEnumerator()`:http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterators.html#asEnumeration(java.util.迭代器) (2认同)