获取Java中映射(HashMap)的枚举(用于键)?

获取Java中映射(HashMap)的枚举(用于键)?,java,enumeration,Java,Enumeration,据我所知,似乎没有一种直接的方法可以直接为HashMap的键获取枚举。我只能得到一个keySet()。从集合,我可以得到一个迭代器,但是迭代器似乎与枚举不同 从HashMap的键直接获取枚举的最佳和最有效的方法是什么 背景:我正在实现我自己的(=>getKeys()Method),我必须提供/实现一个返回所有键枚举的方法。但是我的实现是基于一个HashMap,所以我需要找出如何在这两种“迭代器/枚举器”技术之间进行最佳转换。有一个适配器,使迭代器可以像枚举一样使用。看一看 使迭代器实例显示为枚举

据我所知,似乎没有一种直接的方法可以直接为
HashMap
的键获取
枚举。我只能得到一个
keySet()
。从
集合
,我可以得到一个
迭代器
,但是
迭代器
似乎与
枚举
不同

HashMap
的键直接获取
枚举
的最佳和最有效的方法是什么

背景:我正在实现我自己的(=>
getKeys()
Method),我必须提供/实现一个返回所有键枚举的方法。但是我的实现是基于一个
HashMap
,所以我需要找出如何在这两种“迭代器/枚举器”技术之间进行最佳转换。

有一个适配器,使
迭代器可以像
枚举
一样使用。看一看

使迭代器实例显示为枚举实例的适配器

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

Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator());
或者,如果您(出于某种原因)不想包含commons集合,您可以自己实现这个适配器。这很简单-只需实现
枚举
,在构造函数中传递
迭代器
,并且每当调用
hasMoreElements()
NextElements()
时,就在底层
迭代器上调用
hasNext()
next()


如果某个API契约(我假设是这样)强迫您使用
枚举
,请使用此选项。否则请使用迭代器,这是推荐的选项。

我认为您可以使用java.util.Collections类中的方法枚举来实现所需的功能

enumerate方法的API文档是这样说的:

公共静态枚举(集合c)
返回指定集合上的枚举。这提供了与需要枚举作为输入的遗留API的互操作性。

例如,下面的代码段从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());
 }
final Map test=new HashMap();
测试。放置(“一”,1);
测试。放置(“两”,2);
测试。放置(“三”,3);
最终枚举强度=Collections.Enumeration(test.keySet());
while(strengum.hasMoreElements()){
System.out.println(strengum.nextElement());
}
结果输出为:
一个
两个

三个

您可以编写一个适配器以适应枚举

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

    }

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

您有什么理由需要枚举而不是迭代器吗?Enumeration的Javadoc建议您改用Iterator。好吧,我正在实现的类需要一个枚举:(请参见此处的getKey()方法)我唯一能做的就是实现它,完全不同,而不使用HashMap。尽管如此,我还是非常有兴趣了解获取地图键枚举的最佳和最有效的方法。谢谢Google Collections还使用迭代器支持此操作。asEnumerator()
:hello Bozho。谢谢,特别有趣的是你对如何在我自己身上实现这一点的评论。到目前为止,我还没有意识到我自己可以做到这一点。+1这是一条路,只要你从收藏开始。无需编写自己的适配器来枚举密钥集。