質問

private HashMap<DataObject, HashSet> AllDataObjects;

...

/** Returns all DataObject elements that are NOT in the specified set. */
private DataObject[] invert( HashSet<DataObject> set )
{
    HashSet<DataObject> keys = (HashSet) AllDataObjects.keySet();
    keys = (HashSet) keys.clone();

    keys.removeAll( set );

    return (DataObject[]) keys.toArray();
}

私はこのプロセスを通じてAllDataObjectsを変更したくないことに注意してください。私はおそらく、私はその後、AllDataObjectsに影響を与えずからDataObjectを削除することができシャローコピーを返しクローンを、使用することをHashSetのに(私はsetパラメータから減算したいsetsある)AllDataObjects」キーのセットをキャストします。

これはあなたに右見ていますか?

役に立ちましたか?

解決

新しいセットを作成し、引数としてクローニングする1つを与えます。これは、鋳造を回避し、あなたがジェネリックを失うことはありません。

private DataObject[] invert( Set<DataObject> set ){
    Set<DataObject> keys = new HashSet<DataObject>(AllDataObjects.keySet());
    keys.removeAll( set );
    return keys.toArray(new DataObject[]{});
}

また、あなたはパラメータにHashSetのではなく、設定して使用する必要があることは注目に値しますようにそうではない過度の負担あなたの顧客をする。

他のヒント

これらのセットは、リレーショナルクエリによって移入されたことを知って、私はあなたが、少なくともあなたはメモリにそれをやってのではなく、欲しいものを得るために、より良いSQLクエリを書くトレードオフすることを示唆しています。いくつかの理由があります。まず、ほとんどのリレーショナルデータベースは、あなたのコードの意志よりも効率的にこれを行うために最適化されています。第二に、あなたは、リレーショナルデータベースは、それがために意図されていた作業の多くを行う実行しているサーバーをせています。第三に、セットのサイズはあなたが必要以上に、結果を持ち帰る彼らのためにメモリを割り当て、その後、不要な結果を捨てることによって、中間層に負担をかけることになります大きくなった場合。

私は、このリンクは、あなたがしなければならない場合は、そのメソッドを書くためのより良い方法があると思います:

のJava :への容易な、簡単な方法はありますAND、OR、またはXOR一緒にセットする

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