6
votes

Comment calculer l'intersection entre plus de deux hashsets?

Considérant le code ci-dessous et le fait que les 4 hashset S sont remplis d'ailleurs.

Mon objectif est de contenir tous les éléments communs dans les 4 hachures de 4 hachures.

Ma question est-ce tout d'abord, je le fais-je correctement? Deuxièmement, si je le fais bien, y a-t-il une meilleure façon de le faire? Sinon, quelle solution ai-je pour ce problème? xxx


0 commentaires

3 Réponses :


0
votes

Je pense que la meilleure façon de gérer cela est avec Groovy. Je sais que vous n'avez pas demandé Groovy, mais à tout moment, je peux convertir tout ce code en une ligne, il est difficile de résister. XXX


0 commentaires

9
votes

Je pense que vous pouvez simplement appeler retenuall () code> sur le premier ensemble, à l'aide des seconde, troisième et quatrième définit en tant que paramètres:

private static Set<String> getIntersectionSet() {
    // create a deep copy of one (in case you don't wish to modify it)
    Set<String> interQrels = new HashSet<>(one);

    interQrels.retainAll(two);     // intersection with two (and one)
    interQrels.retainAll(three);   // intersection with three (and two, one)
    interQrels.retainAll(four);    // intersection four (and three, two, one)

    return interQrels;
}


2 commentaires

Donc, je fais juste sur-réagir pour peupler le premier set à chaque fois que j'utilise retenuall () ? Je viens de craindre que si certaines informations deviennent manquées.


Si un élément est vraiment commun aux quatre séries, vous n'avez pas besoin de continuer à l'ajouter (pensez-y un instant).



3
votes

Je suis un peu nouveau à Java 8, mais cela semble assez lisible:

@Test
public void testIntersectionBetweenSets() {
    Collection<String> one = new HashSet<>(4);
    one.add("Larry");
    one.add("Mark");
    one.add("Henry");
    one.add("Andrew");
    Set<String> two = new HashSet<>(2);
    two.add("Mark");
    two.add("Andrew");
    Set<String> three = new HashSet<>(3);
    three.add("Mark");
    three.add("Mary");
    three.add("Andrew");
    Set<String> four = new HashSet<>(3);
    four.add("Mark");
    four.add("John");
    four.add("Andrew");

    Set<String> intersection = one.stream()
            .filter(two::contains)
            .filter(three::contains)
            .filter(four::contains)
            .collect(Collectors.toSet());

    Collection<String> expected = new HashSet<>(2);
    expected.add("Andrew");
    expected.add("Mark");
    Assert.assertEquals(expected, intersection);
}


1 commentaires

Nice - devrait-il faire des ruisseaux;) +1