HashMapのキーからHashSetを取得しますか?
質問
かなり大きい(100,000のエントリ) HashMap
があります。ここで、この HashMap
のすべてのキーを含む HashSet
が必要です。残念ながら、 HashMap
には keySet()
メソッドのみがあり、 HashSet
ではなく Set
を返します。
Javaを使用してこのような HashSet
を生成する効率的な方法は何ですか?
解決
なぜHashSetが特に必要なのですか
すべてのセットは同じインターフェースを持っているため、通常は、すべてのセットでSetインターフェースを使用することが適切なプラクティスであるため、交換可能に使用できます。
本当に必要な場合は、一方を他方から作成できます。汎用コードの場合、次のようになります。
Map<B, V> map = ...;
HashSet<B> set = new HashSet<B>(map.keySet());
他のヒント
「効率的」という言葉が質問の重要な部分であり、セットで何をしたいかに応じて、HashSetの実装を無視してビューを表示する独自のHashSetのサブクラスを作成することをお勧めします代わりに、既存のマップ上に。
部分的に実装された例として、次のようになります:
public class MapBackedHashSet extends HashSet
{
private HashMap theMap;
public MapBackedHashSet(HashMap theMap)
{
this.theMap = theMap;
}
@Override
public boolean contains(Object o)
{
return theMap.containsKey(o);
}
/* etc... */
}
クラスの使用方法がわからない場合は、関連するすべてのメソッドをオーバーライドするように注意する必要があります。
HashSet myHashSet = new HashSet(myHashMap.keySet());
試したことはありません。
既存の Set
から HashSet
を作成できませんか?しかし(より重要なことですが) keySet()
メソッドから返された実装が心配なのはなぜですか?
Set set = new HashSet(map.keySet());
所属していません StackOverflow