2012-10-18 1 views
18

J'ai un LinkedHashSet, c'est-à-dire un ensemble ordonné. J'essaye de trouver une fonction pour retourner juste 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 utilisant une itération du premier ensemble, mais j'espérais quelque chose de plus succinct.Création d'un sous-ensemble d'un ensemble en Java

Jetez également un coup d'oeil aux bibliothèques de Google Guava, mais je ne pouvais pas voir ce que je voulais.

+0

Si vous pouvez utiliser 'SortedSet' alors vous avez déjà une méthode pour prendre en sous-ensemble de celui-ci .. –

+0

SortedSet est pas bon que leur ordre naturel est pas ce que je Je veux que leur ordre d'insertion commande –

Répondre

29

En Goyave:

Set<Integer> 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.

+0

Merci, j'avais une petite idée qu'il y aurait un moyen de le faire dans la goyave. –

+9

et si je veux obtenir de l'index 20-40? – Dejell

4

Vous pouvez utiliser d'abord un SortedSet car il existe la méthode subSet. Vous pouvez également ajouter le contenu de votre jeu à un 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 devriez rester avec l'itération sur l'ensemble car il sera plus efficace.

15

Vous pouvez le faire:

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)); 
+4

+1 pour une pensée originale. :) –

+0

Ça a l'air bien, sauf que vous devez créer un autre Set et un ArrayList mais je peux vivre avec ça. –

+0

Une raison particulière pour le downvote? – Reimeus

1

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; 
} 
7

Une solution en 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;.

+0

Vous voulez dire limite() pas sauter() je pense. – dnellis74

+1

@ dnellis74: Ah, bien sûr, merci, mis à jour. – Lii

2

En Java 8, vous pouvez faire

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