J'ai besoin de combiner deux ensembles de chaînes tout en filtrant les informations redondantes, c'est la solution que j'ai trouvée, y a-t-il une meilleure façon que quelqu'un puisse suggérer? Peut-être quelque chose de construit que j'ai négligé? Je n'ai pas eu de chance avec Google.
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
addAll
et l'utilisation de Streams est: • l'utilisationset1.addAll(set2)
aura pour effet secondaire de modifier physiquement le contenu deset1
. • Cependant, l'utilisation de Streams entraînera toujours une nouvelle instanceSet
contenant le contenu des deux ensembles sans modifier aucune des instances de l'ensemble d'origine. À mon humble avis, cette réponse est meilleure car elle évite les effets secondaires et le potentiel de modifications inattendues de l'ensemble d'origine s'il devait être utilisé ailleurs en attendant le contenu original. HTHLa même chose avec la goyave :
la source
Du jeu de définition contient uniquement des éléments uniques.
Set<String> distinct = new HashSet<String>(); distinct.addAll(oldStringSet); distinct.addAll(newStringSet);
Pour améliorer votre code, vous pouvez créer une méthode générique pour cela
public static <T> Set<T> distinct(Collection<T>... lists) { Set<T> distinct = new HashSet<T>(); for(Collection<T> list : lists) { distinct.addAll(list); } return distinct; }
la source
Si vous utilisez Guava, vous pouvez également utiliser un constructeur pour obtenir plus de flexibilité:
ImmutableSet.<String>builder().addAll(someSet) .addAll(anotherSet) .add("A single string") .build();
la source
Utilisez juste
newStringSet.addAll(oldStringSet)
. Pas besoin de vérifier les doublons car l'Set
implémentation le fait déjà.la source
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Puisque les ensembles ne peuvent pas avoir de doublons, le simple ajout de tous les éléments de l'un à l'autre génère l'union correcte des deux.
la source
Cela produira l'union de s1 et s2
la source
Utiliser
boolean addAll(Collection<? extends E> c)
Ajoute tous les éléments de la collection spécifiée à cet ensemble s'ils ne sont pas déjà présents (opération facultative). Si la collection spécifiée est également un ensemble, l'opération addAll modifie effectivement cet ensemble afin que sa valeur soit l'union des deux ensembles. Le comportement de cette opération n'est pas défini si la collection spécifiée est modifiée pendant que l'opération est en cours.
la source
Si vous vous souciez des performances, et si vous n'avez pas besoin de conserver vos deux ensembles et que l'un d'eux peut être énorme, je vous suggère de vérifier quel ensemble est le plus grand et d'ajouter les éléments du plus petit.
Set<String> newStringSet = getNewStringSet(); Set<String> oldStringSet = getOldStringSet(); Set<String> myResult; if(oldStringSet.size() > newStringSet.size()){ oldStringSet.addAll(newStringSet); myResult = oldStringSet; } else{ newStringSet.addAll(oldStringSet); myResult = newStringSet; }
De cette façon, si votre nouvel ensemble comporte 10 éléments et votre ancien ensemble en contient 100 000, vous ne faites que 10 opérations au lieu de 100 000.
la source
public boolean addAll(int index, Collection<? extends E> c, boolean checkSizes)
Si vous utilisez Apache Common, utilisez la
SetUtils
classe deorg.apache.commons.collections4.SetUtils;
la source
SetView
, qui est immuable.Ajoute tous les éléments de la collection spécifiée à cet ensemble s'ils ne sont pas déjà présents (opération facultative). Si la collection spécifiée est également un ensemble, l'opération addAll modifie effectivement cet ensemble afin que sa valeur soit l'union des deux ensembles
la source