3
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たい s です)をsetHashSet にキャストしてクローンを使用しました。setAllDataObjects

あなたにはこれが正しいように見えますか?

4

3 に答える 3

12

新しいセットを作成し、複製するセットを引数として指定します。これによりキャストが回避されるため、ジェネリックが失われません。

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

クライアントに過度の負担をかけないように、パラメーターには HashSet ではなく Set を使用する必要があることにも注意してください。

于 2008-12-26T19:00:26.723 に答える
1

これらのセットがリレーショナル クエリによって設定されていることを知っているので、メモリ内で実行するのではなく、より適切な SQL クエリを作成して必要なものを取得することを少なくともトレードオフすることをお勧めします。理由はいくつかあります。まず、ほとんどのリレーショナル データベースは、コードよりも効率的にこれを行うように最適化されています。2 つ目は、リレーショナル データベースが実行されているサーバーに、本来の目的よりも多くの作業を任せることです。第 3 に、セットのサイズが大きくなると、結果を戻し、それらにメモリを割り当て、不要な結果を破棄する必要があるため、中間層に不必要な負荷がかかります。

于 2008-12-27T14:18:56.057 に答える
1

必要に応じて、このリンクにはそのメソッドを記述するためのより良い方法があると思います:

Java: セットを AND、OR、または XOR する簡単で迅速な方法はありますか?

于 2008-12-27T14:20:27.457 に答える