Domanda

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();
}

Si noti che io non voglio alterare AllDataObjects attraverso questo processo. Ho fuso il set di AllDataObjects' chiavi (che sono le DataObjects che voglio il parametro set per sottrarre da) in un HashSet da usare clone, che restituisce presumibilmente una copia che posso togliere set da senza influire AllDataObjects.

Questo sembra giusto per te?

È stato utile?

Soluzione

Crea un nuovo insieme e dare quella da clonare come argomento. Questo evita casting e in modo da non perdere farmaci generici.

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

E 'anche interessante notare che si dovrebbe utilizzare SET piuttosto che HashSet per il parametro in modo da gravare non eccessivamente i vostri clienti.

Altri suggerimenti

Sapendo che questi set sono stati popolati da una query relazionale, vorrei suggerire che almeno compromesso scrivendo una migliore query SQL per ottenere ciò che si vuole, piuttosto che farlo in memoria. Ci sono diversi motivi. In primo luogo, la maggior parte dei database relazionali sono ottimizzati per fare questo in modo più efficiente di quanto il tuo codice di volontà. In secondo luogo, si sta lasciando il server in cui il database relazionale è in esecuzione fare di più del lavoro che è stato destinato. In terzo luogo, se la dimensione degli insiemi diventano grandi sarete inutilmente appesantire il livello intermedio dal dover riportare i risultati, allocare memoria per loro, e poi buttare via i risultati indesiderati.

Credo che questo link è un modo migliore per scrivere che metodo se è necessario:

Java : c'è un, rapido modo semplice per AND, OR, XOR o insieme insiemi

?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top