2012-10-18 25 views
18

में एक सेट का सबसेट बनाना मेरे पास LinkedHashSet है, यानी एक ऑर्डर किया गया सेट है। मैं सिर्फ सेट के सबसेट को वापस करने के लिए फ़ंक्शन ढूंढने की कोशिश कर रहा हूं, यानी सेट के पहले 20 तत्व। मुझे पता है कि मैं इसे एक नया सेट बनाकर और फिर पहले सेट के पुनरावृत्ति का उपयोग करके पॉपुलटिंग कर सकता हूं लेकिन मैं कुछ और संक्षिप्त की उम्मीद कर रहा था।जावा

Google के गुवा पुस्तकालयों पर भी एक नज़र डालें, लेकिन मैं जो चाहता था उसे नहीं देख सका।

+0

आप 'उपयोग कर सकते हैं SortedSet' तो आप पहले से ही इसे से बाहर सबसेट लेने के लिए एक विधि है .. –

+0

SortedSet अच्छा नहीं के रूप में उनके प्राकृतिक आदेश है कि मैं क्या नहीं है चाहते हैं कि मैं उनके सम्मिलन आदेश को बॉक्स सोचने के लिए –

उत्तर

29

अमरूद में:

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

ध्यान दें कि Iterables.limit() मूल्यांकन किया जाता है lazily, इसलिए केवल एक अतिरिक्त संग्रह बनाई गई है।

+0

धन्यवाद मुझे एक स्याही थी, यह अमरूद में ऐसा करने का एक तरीका होगा। –

+9

क्या होगा यदि मैं सूचकांक 20-40 से प्राप्त करना चाहता हूं? – Dejell

4

या तो आप पहले SortedSet पर उपयोग कर सकते हैं क्योंकि subSet विधि इस पर मौजूद है।

आप अपने सेट की सामग्री को List पर भी जोड़ सकते हैं और उस पर subList विधि का उपयोग कर सकते हैं। लेकिन यह आपके Set में संग्रहीत डेटा की मात्रा पर निर्भर करता है क्योंकि आप डेटा की एक बड़ी मात्रा को डुप्लिकेट नहीं करना चाहते हैं।

अन्यथा आपको सेट पर पुनरावृत्ति के साथ रहना चाहिए क्योंकि यह अधिक कुशल होगा।

15

आप ऐसा कर सकता है:

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 ऑर्डर करना चाहता हूं। :) –

+0

थैंक जो साफ दिखते हैं, इस तथ्य को छोड़कर कि आपको एक और सेट और एक ऐरेलिस्ट बनाना है, लेकिन मैं इसके साथ रह सकता हूं। –

+0

डाउनवोट के लिए कोई विशेष कारण? – Reimeus

1

सरल सहायक विधि (आप इसे सेट या किसी अन्य संग्रह के लिए उपयोग कर सकते हैं):

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

एक समाधान जावा 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()); 

इसमें यह माना जाता import static java.util.stream.Collectors.toCollection;

+0

आपका मतलब है सीमा() नहीं छोड़ें() मुझे लगता है। – dnellis74

+1

@ dnellis74: आह, ज़ाहिर है, धन्यवाद, अपडेट किया गया। – Lii

2

जावा 8 में आप क्या कर सकते हैं

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