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


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

A également jeté un coup d'œil aux bibliothèques de Goyaves de Google, mais n'a pas pu voir ce que je voulais.

Author: jbduncan, 2012-10-18

6 answers

Dans 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.

 33
Author: Tomasz Nurkiewicz, 2012-10-18 19:50:33

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));
 15
Author: Reimeus, 2014-11-18 15:34:32

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 import static java.util.stream.Collectors.toCollection;.

 9
Author: Lii, 2017-08-16 17:31:19

En Java 8, vous pouvez faire

youSet.stream()
   .skip(start) // the offset
   .limit(count) // how many items you want
   .collect(Collectors.toSet());
 7
Author: thiagoh, 2016-06-02 19:12:41

, Vous pouvez soit utiliser au premier abord un SortedSet comme subSet méthode existe sur elle.

, Vous pouvez également ajouter le contenu de votre jeu à un List et utiliser le subList méthode. 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 elle sera plus efficace.

 4
Author: Alex, 2012-10-18 19:30:49

Méthode d'aide 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;
}
 1
Author: user1079877, 2015-02-26 05:21:33