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 renvoyer 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 le renseignant à l’aide d’une itération du premier, mais j’espérais quelque chose de plus succinct.

J’ai également jeté un coup d’œil aux bibliothèques de goyave de Google, mais je ne pouvais pas voir ce que je voulais.

En goyave:

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

Notez que Iterables.limit() est évalué paresseusement, de sorte qu’une seule collection supplémentaire est créée.

Vous pouvez faire ceci:

 Set set = new LinkedHashSet<>(); for (int i = 0; i < 50; i++) { set.add(i); } List list = new ArrayList<>(set); Set subSet = new LinkedHashSet<>(list.subList(0, 20)); 

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

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

En Java 8, vous pouvez faire

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

Vous pouvez d’abord utiliser un SortedSet car la méthode de sous- subSet existe.

Vous pouvez également append le contenu de votre ensemble à une List et utiliser la méthode subList . 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 devez restr avec l’itération sur l’ensemble car il sera plus efficace.

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

 public static  List listOf(final Collection set, final int limit) { final List list = new ArrayList<>(limit); final Iterator i = set.iterator(); for (int j = 0; j < limit && i.hasNext(); j++) { list.add(i.next()); } return list; }