web-dev-qa-db-fra.com

Création d'un sous-ensemble d'un ensemble dans Java

J'ai un LinkedHashSet, c'est-à-dire un ensemble ordonné. J'essaie de trouver une fonction pour renvoyer simplement un sous-ensemble de l'ensemble, c'est-à-dire les 20 premiers éléments de l'ensemble. Je sais que je peux le faire en créant un nouvel ensemble, puis en remplissant en utilisant une itération du premier ensemble, mais j'espérais quelque chose de plus succinct.

J'ai également jeté un œil aux bibliothèques de Google sur la goyave, mais je n'ai pas vu ce que je voulais.

29
Paul Taylor

À la goyave:

Set<Integer> subset = ImmutableSet.copyOf(Iterables.limit(set, 20));

Notez que Iterables.limit() est évalué paresseusement, donc une seule collection supplémentaire est créée.

36
Tomasz Nurkiewicz

Vous pouvez faire ceci:

Set<Integer> set = new LinkedHashSet<>();
for (int i = 0; i < 50; i++) {
   set.add(i);
}

List<Integer> list = new ArrayList<>(set);
Set<Integer> subSet = new LinkedHashSet<>(list.subList(0, 20));
18
Reimeus

Une solution utilisant des flux et des collecteurs de Java 8:

Set<Integer> subSet = set.stream()
    .limit(20)
    .collect(toCollection(LinkedHashSet::new));
    // You could also collect to something else 
    // with another collector like this: 
    // .collect(toList());

Cela suppose l'importation suivante:

import static Java.util.stream.Collectors.toCollection;
16
Lii

Dans Java 8 vous pouvez faire

mySet.stream()
   .skip(start) // the offset
   .limit(count) // how many items you want
   .collect(Collectors.toSet());
14
thiagoh

Vous pouvez soit utiliser d'abord un SortedSet car la méthode subSet existe dessus.

Vous pouvez également ajouter le contenu de votre ensemble à un List et utiliser la méthode subList dessus. Mais cela dépend de la quantité de données stockées dans votre Set car vous ne voudriez pas dupliquer un énorme volume de données.

Sinon, vous devriez rester avec l'itération sur l'ensemble car il sera plus efficace.

5
Alex

Méthode d'assistance simple (vous pouvez l'utiliser pour Set ou toute autre collection):

public static <T> List<T> listOf(final Collection<T> set, final int limit) {
    final List<T> list = new ArrayList<>(limit);

    final Iterator<T> i = set.iterator();
    for (int j = 0; j < limit && i.hasNext(); j++) {
        list.add(i.next());
    }

    return list;
}
2
user1079877