私がこれを理解している限り、Enumeration
のキーに対してHashMap
を直接取得する直接的な方法はないようです。 keySet()
しか取得できません。そのSet
から、Iterator
を取得できますが、Iterator
はEnumeration
とは異なるようです。
Enumeration
のキーからHashMap
を直接取得するための最良かつ最もパフォーマンスの高い方法は何ですか?
背景:私は自分自身の ResourceBundle (=> getKeys()
メソッド)を実装しており、すべてのキーの列挙を返すメソッドを提供/実装する必要があります。しかし、私の実装はHashMap
に基づいているので、これら2つの「イテレーター/列挙子」手法を最適に変換する方法をどうにかして理解する必要があります。
Apache commons-collectionsIterator
をEnumeration
のように使用できるようにするアダプターがあります。 IteratorEnumeration を見てください。
イテレータインスタンスを列挙型インスタンスのように見せるためのアダプタ
つまり、次のことを行います。
_Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator());
_
または、(何らかの理由で)commons-collectionsを含めたくない場合は、このアダプターを自分で実装できます。簡単です。Enumeration
の実装を作成し、コンストラクターでIterator
を渡すだけで、hasMoreElements()
とnextElement()
が呼び出されるたびに呼び出します。基になるIterator
のhasNext()
およびnext()
。
APIコントラクトによってEnumeration
を使用せざるを得ない場合は、これを使用します(私が想定しているように)。それ以外の場合はIterator
を使用します-これは推奨されるオプションです。
私はあなたが方法を使うことができると思います 列挙 から 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
二
三
列挙型に適応するアダプターを作成できます。
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();
}
}
そして、このカスタム列挙を使用できます:)