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

时间:2010-01-12 10:16:56

标签: java enumeration

据我了解,似乎没有直接获取Enumeration的{​​{1}}密钥的方法。我只能获得HashMap。从keySet()开始,我可以获得Set,但Iterator似乎与Iterator不同。

Enumeration的密钥中直接获取Enumeration的最佳和最佳效果是什么?

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

3 个答案:

答案 0 :(得分:41)

我认为您可以使用 java.util.Collections 类中的方法枚举来实现您想要的效果。

枚举方法的API文档可以这样说:

public static Enumeration枚举(Collection c)
返回指定集合的​​枚举。这提供了与需要枚举作为输入的旧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());
 }

并产生输出:
一个
2个
三个

答案 1 :(得分:21)

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

  

使Iterator实例成为Enumeration实例的适配器

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

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

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

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

答案 2 :(得分:0)

您可以编写适配器来适应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();
        }

    }

然后您可以使用此自定义枚举:)