クローニングと減算セット - この仕事をしますか?
-
23-08-2019 - |
質問
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
パラメータから減算したいset
sある)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クエリを書くトレードオフすることを示唆しています。いくつかの理由があります。まず、ほとんどのリレーショナルデータベースは、あなたのコードの意志よりも効率的にこれを行うために最適化されています。第二に、あなたは、リレーショナルデータベースは、それがために意図されていた作業の多くを行う実行しているサーバーをせています。第三に、セットのサイズはあなたが必要以上に、結果を持ち帰る彼らのためにメモリを割り当て、その後、不要な結果を捨てることによって、中間層に負担をかけることになります大きくなった場合。
私は、このリンクは、あなたがしなければならない場合は、そのメソッドを書くためのより良い方法があると思います:
?