7

私はかなり大きい(10万のエントリ)を持っていますHashMap。今、私はこれからのHashSetすべてのキーを含む必要がありますHashMap。残念ながら、を返すメソッドHashMapしかありませんが、を返しません。keySet()SetHashSet

HashSetこのようなJavaを使用して生成する効率的な方法は何でしょうか。

4

5 に答える 5

20

なぜハッシュセットが特に必要なのですか?

すべての Set は同じインターフェイスを持っているため、通常は交換可能に使用できます。適切な方法では、すべての Set インターフェイスを使用する必要があるためです。


本当に必要な場合は、一方から他方を作成できます。一般的なコードの場合、次のようになります。

    Map<B, V> map = ...;
    HashSet<B> set = new HashSet<B>(map.keySet());
于 2009-10-26T16:41:05.510 に答える
6

「効率的」という言葉が質問の重要な部分であると仮定すると、セットで何をしたいかによっては、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... */
}

クラスがどのように使用されるかわからない場合は、関連するすべてのメソッドをオーバーライドするように注意する必要があります。

于 2009-10-26T17:05:36.880 に答える
4
HashSet myHashSet = new HashSet(myHashMap.keySet());

試したことはありません。

于 2009-10-26T16:40:22.267 に答える
3

HashSet既存の から を作成できませんSetか? しかし (もっと重要なことに) メソッドから返された実装について心配するのはなぜkeySet()ですか?

于 2009-10-26T16:40:28.520 に答える
2

set=new HashSet(map.keySet()); を設定します。

于 2009-10-26T16:40:52.593 に答える