質問

かなり大きい(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());

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top