Frage

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

Beachten Sie, dass ich nicht will AllDataObjects durch diesen Prozess verändern. Ich gegossen den Satz von AllDataObjects‘Tasten (die die DataObjects ich die set Parameter von subtrahieren wollen) in ein HashSet Klon zu verwenden, die angeblich eine flache Kopie gibt, dass ich dann set von außen beeinflussen AllDataObjects entfernen können.

Sieht das Recht auf Sie?

War es hilfreich?

Lösung

Erstellen

einen neuen Satz und gibt den einen als Argument geklont werden. Dadurch wird vermieden, Gießen und so verlieren Sie keine Generika.

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

Es ist auch erwähnenswert, dass Sie eher als HashSet für den Parameter Satz verwenden sollten, um nicht übermäßig belasten Ihre Kunden.

Andere Tipps

Das Wissen, dass diese Sätze durch eine relationale Abfrage bevölkert wurden, würde ich vorschlagen, dass Sie zumindest einen Kompromiss eine bessere SQL-Abfrage schreiben zu bekommen, was Sie wollen, anstatt es in Erinnerung zu tun. Es gibt mehrere Gründe, warum. Zunächst werden die meisten relationalen Datenbanken optimiert dies zu tun effizienter als Ihr Code. Zweitens sind in dem Sie den Server, auf dem die relationale Datenbank ausgeführt wird, mehr Arbeit tun, die es bestimmt war. Drittens, wenn die Größe der Sätze groß werden, werden Sie unnötig die mittlere Ebene zu belasten, indem die Ergebnisse zurück zu bringen, weisen Speicher für sie, und dann die unerwünschten Ergebnisse wegzuwerfen.

Ich denke, diese Verbindung eine bessere Art und Weise hat diese Methode, wenn Sie müssen schreiben:

Java : gibt es eine einfache, schnelle Möglichkeit, AND, OR, XOR oder zusammen Sätze

?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top