web-dev-qa-db-ja.com

Javaでマップ(HashMap)の列挙型(キー用)を取得しますか?

私がこれを理解している限り、Enumerationのキーに対してHashMapを直接取得する直接的な方法はないようです。 keySet()しか取得できません。そのSetから、Iteratorを取得できますが、IteratorEnumerationとは異なるようです。

EnumerationのキーからHashMapを直接取得するための最良かつ最もパフォーマンスの高い方法は何ですか?

背景:私は自分自身の ResourceBundle (=> getKeys()メソッド)を実装しており、すべてのキーの列挙を返すメソッドを提供/実装する必要があります。しかし、私の実装はHashMapに基づいているので、これら2つの「イテレーター/列挙子」手法を最適に変換する方法をどうにかして理解する必要があります。

20
tim

Apache commons-collectionsIteratorEnumerationのように使用できるようにするアダプターがあります。 IteratorEnumeration を見てください。

イテレータインスタンスを列挙型インスタンスのように見せるためのアダプタ

つまり、次のことを行います。

_Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator());
_

または、(何らかの理由で)commons-collectionsを含めたくない場合は、このアダプターを自分で実装できます。簡単です。Enumerationの実装を作成し、コンストラクターでIteratorを渡すだけで、hasMoreElements()nextElement()が呼び出されるたびに呼び出します。基になるIteratorhasNext()およびnext()

APIコントラクトによってEnumerationを使用せざるを得ない場合は、これを使用します(私が想定しているように)。それ以外の場合はIteratorを使用します-これは推奨されるオプションです。

21
Bozho

私はあなたが方法を使うことができると思います 列挙 から Java.util.Collections あなたが望むものを達成するためのクラス。

列挙するメソッドのAPIドキュメントには、次のように書かれています。

public static Enumeration enumeration(Collection 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());
 }

そして結果の出力は:
1

41
sateesh

列挙型に適応するアダプターを作成できます。

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

    }

そして、このカスタム列挙を使用できます:)

0
richa_v