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.
À 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.
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));
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;
Dans Java 8 vous pouvez faire
mySet.stream()
.skip(start) // the offset
.limit(count) // how many items you want
.collect(Collectors.toSet());
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.
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;
}