2012-10-18 17 views
18

LinkedHashSet, siparişi verilmiş bir kümem var. Setin bir alt kümesini, yani kümenin ilk 20 öğesini döndürmek için bir işlev bulmaya çalışıyorum. Yeni bir set oluşturarak ve daha sonra ilk setin tekrarını kullanarak popülasyon yaparak yapabileceğimi biliyorum ama daha öz bir şey umuyordum.Java'da bir Kümenin alt kümesinin oluşturulması

Ayrıca Google'ın Guava kitaplıklarına bir göz attı, ancak ne istediğimi göremedim.

+0

Eğer SortedSet' o zaman zaten bunun dışında alt küme çekmek için bir yöntem var 'kullanabiliyorsa .. –

+0

SortedSet iyi değil kutu ekleme düşüncesi için –

cevap

29

Guava In: Iterables.limit() tembel, bu yüzden sadece bir ekstra koleksiyon oluşturulduktan değerlendirilir

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

Not söyledi.

+0

Teşekkürler Bir mazeretim vardı, bunu guava'da yapmanın bir yolu olurdu. –

+9

endeks 20-40 dizininden almak istersem? – Dejell

4

İlk başta SortedSet'da subSet yöntemi var olarak kullanabilirsiniz.

Ayrıca, kümenizin içeriğini List'a ekleyebilir ve üzerinde subList yöntemini kullanabilirsiniz. Ancak, çok büyük miktarda veriyi çoğaltmak istemediğiniz için, Set numaralı dosyanızda depolanan veri miktarına bağlıdır.

Aksi takdirde, daha verimli olacağı için Set üzerinde yineleme ile kalmalısınız.

15

Bunu yapabilirsiniz:

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 numaralı sipariş verme siparişlerini istiyorum. :) –

+0

Başka bir Set ve bir ArrayList yaratmak zorunda olduğunuz gerçeğinin dışında düzgün görünen THanks ama ben bununla yaşayabilirim. –

+0

Reddetmenin herhangi bir nedeni var mı? – Reimeus

1

Basit yardımcı yöntemi (Sen Set veya başka bir koleksiyon için kullanabilirsiniz):

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

Java 8'den akışları ve toplayıcıları kullanan bir çözüm:

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()); 

Bu import static java.util.stream.Collectors.toCollection; varsayar. kendi doğal sipariş Ben ne değildir olarak

+0

Limit() değil skip() düşünüyorum. – dnellis74

+1

@ dnellis74: Ah, elbette, teşekkürler, güncellendi. – Lii

2

Java 8'de yapabileceğiniz

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