101 votes

Existe-t-il un meilleur moyen de combiner deux ensembles de chaînes en Java ?

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 un meilleur moyen que quelqu'un puisse suggérer? Peut-être quelque chose de intégré 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);
    }
}

128voto

dacwe Points 26160

Comme un Set ne contient pas d'entrées en double, vous pouvez donc combiner les deux en :

 newStringSet.addAll(oldStringSet);

Ce n'est pas grave si vous ajoutez des choses deux fois, l'ensemble ne contiendra l'élément qu'une seule fois... par exemple, il n'est pas nécessaire de vérifier en utilisant la méthode contains .

109voto

ytterrr Points 1313

Vous pouvez le faire en utilisant ce one-liner

 Set<String> combined = Stream.concat(newStringSet.stream(), oldStringSet.stream())
        .collect(Collectors.toSet());

Avec une importation statique, c'est encore plus joli

 Set<String> combined = concat(newStringSet.stream(), oldStringSet.stream())
        .collect(toSet());

Une autre méthode consiste à utiliser la méthode flatMap :

 Set<String> combined = Stream.of(newStringSet, oldStringSet).flatMap(Set::stream)
        .collect(toSet());

De plus, n'importe quelle collection peut facilement être combinée avec un seul élément

 Set<String> combined = concat(newStringSet.stream(), Stream.of(singleValue))
        .collect(toSet());

40voto

proactive-e Points 1619

Idem pour la goyave :

 Set<String> combinedSet = Sets.union(oldStringSet, newStringSet)

13voto

De la définition Set ne contient que 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;
}

8voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X