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

据我所知,似乎没有直接获取HashMap的键的Enumeration的直接方法。 我只能得到一个keySet() 。 从那个Set ,我可以得到一个Iterator但是Iterator似乎与Enumeration不同。

HashMap的键直接获取Enumeration的最佳和最HashMap什么?

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

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

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

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

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

或者,如果您(出于某种原因)不想包含commons-collections,则可以自己实现此适配器。 这很容易 – 只需要实现Enumeration ,在构造函数中传递Iterator ,并且每当调用hasMoreElements()nextElement() ,就可以在底层Iterator上调用hasNext()next()

如果您被迫通过某种API合同使用Enumeration (我认为是这样),请使用此选项。 否则使用Iterator – 这是推荐的选项。

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

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

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

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

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

结果输出是:


您可以编写适配器以适应Enumeration。

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

然后你可以使用这个自定义枚举:)