2012-10-18 21 views
18

Ich habe eine LinkedHashSet, d. H. Eine geordnete Menge. Ich versuche eine Funktion zu finden, die nur eine Teilmenge der Menge zurückgibt, d. H. Die ersten 20 Elemente der Menge. Ich weiß, dass ich es schaffen kann, indem ich ein neues Set erstelle und dann mit einer Iteration des ersten Sets bevölkere, aber ich habe auf etwas Kurzes gehofft.Erstellen einer Teilmenge eines Satzes in Java

Guckte auch Google Guava-Bibliotheken, aber konnte nicht sehen, was ich wollte.

+0

Wenn Sie verwenden können, 'SortedSet' dann bereits eine Methode aus ihm heraus zu nehmen Subset .. –

+0

SortedSet ist nicht gut, als ihre natürliche Ordnung nicht das, was ich Ich möchte ihre Bestellung bestellen –

Antwort

29

In Guava:

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

Beachten Sie, dass Iterables.limit() lazily ausgewertet wird, so dass nur eine zusätzliche Sammlung erstellt wird.

+0

Danke Ich hatte eine Ahnung, dass es eine Möglichkeit geben würde, dies in Guave zu tun. –

+9

was, wenn ich vom Index 20-40 bekommen möchte? – Dejell

4

Sie können entweder zuerst eine SortedSet verwenden, da die subSet-Methode darauf existiert.

Sie können auch den Inhalt Ihres Sets zu einer List hinzufügen und die subList Methode verwenden. Aber es hängt von der Menge der Daten ab, die in Ihrem Set gespeichert werden, da Sie eine riesige Datenmenge nicht duplizieren möchten.

Andernfalls sollten Sie mit der Iteration über das Set bleiben, da es effizienter wird.

15

Sie können dies tun:

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 für Out of the Box Denken. :) –

+0

THanks, die ordentlich aussehen, außer der Tatsache, dass Sie sowohl ein anderes Set und eine ArrayList erstellen müssen, aber ich kann damit leben. –

+0

Gibt es einen besonderen Grund für den Downvote? – Reimeus

1

Einfache Hilfsmethode (Sie können es für Set verwenden oder jede andere Sammlung):

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

Eine Lösung Strom und Sammler von Java unter Verwendung von 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()); 

Diese import static java.util.stream.Collectors.toCollection; annehmen.

+0

Du meinst limit() nicht überspringen() denke ich. – dnellis74

+1

@ dnellis74: Ah, natürlich, danke, aktualisiert. – Lii

2

In Java 8 Sie tun können,

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