Question

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

Notez que je ne veux pas modifier AllDataObjects à travers ce processus. Je Casted l'ensemble des AllDataObjects » clés (qui sont les DataObjects que je veux le paramètre set à soustraire de) dans un HashSet à utiliser clone, qui retourne soi-disant une copie superficielle que je peux alors retirer set de sans affecter AllDataObjects.

Est-ce que ce regard juste?

Était-ce utile?

La solution

Créez un nouveau jeu et donner l'un à cloner comme argument. Cela permet d'éviter la coulée et donc vous ne perdez pas génériques.

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

Il est également intéressant de noter que vous devez utiliser Set plutôt que HashSet pour le paramètre afin de ne pas trop le fardeau de vos clients.

Autres conseils

Sachant que ces ensembles ont été peuplés par une requête relationnelle, je vous suggère au moins le commerce de l'écriture une meilleure requête SQL pour obtenir ce que vous voulez plutôt que de le faire en mémoire. Il y a plusieurs raisons. Tout d'abord, la plupart des bases de données relationnelles sont optimisées pour le faire plus efficacement que votre volonté de code. Deuxièmement, vous laissez le serveur sur lequel la base de données relationnelle est en cours d'exécution faire plus de travail qu'il était destiné. Troisièmement, si la taille des ensembles devenir grand, vous serez surcharger inutilement le niveau intermédiaire en ayant pour ramener les résultats, allouer de la mémoire pour eux, puis jeter les résultats indésirables.

Je pense que ce lien a une meilleure façon d'écrire cette méthode si vous devez:

Java : y at-il un moyen facile, rapide à ET, oU, ou XOR ensemble des jeux

?
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top