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

发布于 2024-08-17 12:50:21 字数 547 浏览 2 评论 0原文

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

HashMap 的键直接获取 Enumeration 的最佳且最高效的方法是什么?

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

As far as I understand this, it seems that there is not a direct way of getting an Enumeration directly for the Keys of a HashMap. I can only get a keySet(). From that Set, I can get an Iterator but an Iterator seems to be something different than an Enumeration.

What is the best and most performant way to directly get an Enumeration from the Keys of a HashMap?

Background: I am implementing my own ResourceBundle (=>getKeys() Method), and I have to provide/implement a method that returns the Enumeration of all Keys. But my implementation is based on a HashMap so I need to somehow figure out how to best convert betweens these two "Iterator/Enumerator" techniques.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半世蒼涼 2024-08-24 12:50:21

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

枚举方法的 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());
 }

,结果输出为:
一个
两个

I think you can use the method enumeration from java.util.Collections class to achieve what you want.

The API doc of the method enumerate has this to say:


public static Enumeration enumeration(Collection c)
Returns an enumeration over the specified collection. This provides interoperability with legacy APIs that require an enumeration as input.

For example, the below code snippet gets an instance of Enumeration from the keyset of 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());
 }

and resulting the output is:
one
two
three

赠我空喜 2024-08-24 12:50:21

Apache commons-collections 有一个适配器,使 Iterator 可供使用,例如一个枚举。看看 IteratorEnumeration。

使迭代器实例看起来像枚举实例的适配器

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

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

或者,如果您(由于某种原因)不想包含公共集合,您可以自己实现此适配器。这很简单 - 只需实现 Enumeration,在构造函数中传递 Iterator,并且每当 hasMoreElements()nextElement( ) 被调用时,您可以在底层 Iterator 上调用 hasNext()next()

如果某些 API 合约强制您使用Enumeration(正如我假设的情况),请使用此选项。否则使用Iterator - 这是推荐的选项。

Apache commons-collections have an adapter that makes the Iterator available for use like an Enumeration. Take a look at IteratorEnumeration.

Adapter to make an Iterator instance appear to be an Enumeration instances

So in short you do the following:

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

Alternatively, if you (for some reason) don't want to include commons-collections, you can implement this adapter yourself. It is easy - just make an implementation of Enumeration, pass the Iterator in a constructor, and whenever hasMoreElements() and nextElement() are called, you call the hasNext() and next() on the underlying Iterator.

Use this if you are forced to use Enumeration by some API contract (as I assume the case is). Otherwise use Iterator - it is the recommended option.

嘿看小鸭子会跑 2024-08-24 12:50:21

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

    }

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

You can write a adapter to adapt to 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();
        }

    }

And then you can use this custom enumeration :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文