2011-10-21 14 views
6

उदाहरण के लिए, मैं ज्यामितीय आकृतियां की स्थापना की है: वर्ग और सर्किल:जावा में इटेबल से संग्रह कैसे बनाएं?

Set<Figure> figures; 

चित्रा के दो प्रकार के होते हैं।

मैं वर्गों गूगल संग्रह का उपयोग कर के तैयार हो जाओ करना चाहते हैं:

Iterables.filter(figures,squarePredicate); 

लेकिन फिल्टर विधि वापसी Iterable ... मैं कैसे Iterable से सेट बना सकते हैं? (Iterable पर पाश का उपयोग किए बिना)

उत्तर

14

मुझे लगता है कि आपको अपनी आवश्यकताओं पर पुनर्विचार करने की आवश्यकता है। आपको वर्गों का एक सेट चाहिए। क्यूं कर?

एक सेट आप विशिष्टता और यात्रा, ज्यादा कुछ नहीं देता है। आपके पास इटरटेबल में विशिष्टता है, क्योंकि स्रोत एक सेट है, और आप इटरटेबल में आइटम्स को फिर से चालू कर सकते हैं। तो आपको सेट की आवश्यकता क्यों होगी?

इनमें केवल दो संभावित कारण हैं: या तो आप एक API कि एक सेट (या संग्रह) पैरामीटर की जरूरत के साथ काम कर रहे हैं, या आप किसी भी तरह सेट के आकार प्रदर्शित करने के लिए की जरूरत है।

इन मामलों में, सेट बनाने के लिए Sets.newHashSet(iterable) का उपयोग करें (एक तरफ एक पूर्ण पुनरावृत्ति की आवश्यकता है, दूसरी तरफ: आपको एक बिंदु पर पूर्ण पुनरावृत्ति की आवश्यकता होगी, वैसे भी जब आप मूल्यों पर पुनरावृत्ति कर रहे हों, तो अब ऐसा क्यों नहीं करते?)। अन्यथा, केवल इटेरेबल का उपयोग करें और एक सेट के बारे में भूल जाओ।

+0

यह कोड उदाहरण के लिए है। मैंने दो प्रकार की वस्तुओं का सेट किया है। मैं Google संग्रह के साथ एक प्रकार की ऑब्जेक्ट्स फ़िल्टर करना चाहता हूं, और उसके बाद सेट सबस्ट्रक्शन के साथ दूसरी तरह की ऑब्जेक्ट प्राप्त करें। –

+0

छोटे टाइपो: सेट्स। न्यूवैश ** एस ** एट (इटेरिएबल) – tashuhka

+0

@tashuhka निश्चित, धन्यवाद –

1

Sets.newHashSet(Iterable) की तरह कुछ (या जो भी आप की जरूरत यह है) का प्रयोग करें।

1

शायद बजाय अपाचे संग्रह utils से CollectionUtils.filter() कोशिश? आप इसे सेट पर उपयोग कर सकते हैं, या सेट कन्स्ट्रक्टर में परिणामी संग्रह का उपयोग कर सकते हैं।

+0

ओपी गूगल का उपयोग करते हुए राज्य की तरह किया था " संग्रह "। –

+0

प्रश्न गुवा के बारे में है, कॉमन्स/संग्रह नहीं। और समस्या एक जैसी है: फ़िल्टर को लागू करने के लिए आपको पूर्ण पुनरावृत्ति की आवश्यकता है। –

+0

मेरा मानना ​​है कि वह उस समस्या का वर्णन कर रहा था जिसे वह Google संग्रह के साथ सामना कर रहा है, यह कहने के बजाय कि इसका उपयोग करना अनिवार्य है। मैं सिर्फ एक और दिशा में जाने का सुझाव दे रहा हूं यदि यह अनिवार्य नहीं है। केवल एक सलाह। – kgautron

5

अमरूद के Iterables.filter() जानबूझ कर एक Iterable "दृश्य" देता है।

  • आप केवल तत्वों से अधिक पुनरावृति जब तुम सच में (उदाहरण के लिए आप श्रृंखला Iterables.filter() और Iterables.transform() कॉल कर सकते हैं की जरूरत है, और अंत में केवल एक बार पुनरावृति: इस दृष्टिकोण के लिए दो लाभ हैं)।
  • आप देखने से उचित संग्रह बना सकते हैं, ImmutableSet.copyOf(Iterables.filter(..., ...)), Sets.newHashSet(Iterables.filter(..., ...)), या Lists.newArrayList(Iterables.filter(..., ...)) की तरह कुछ का उपयोग कर। Iterables.filter() आपको मनमाने ढंग से लौटने की बजाय आवश्यक सटीक संग्रह चुनने देता है।

मैंने यह भी देखा है कि आप विधेय के साथ Iterables.filter(Iterable unfiltered, Predicate predicate) उपयोग करने के लिए एक विशेष प्रकार की घटनाओं को फिल्टर करने के लिए लग रहे हैं। आपको Iterables.filter(Iterable unfiltered, Class type) अधिभार में रुचि भी हो सकती है, जो दिए गए प्रकार के सभी उदाहरणों को फ़िल्टर करता है, और अधिक विशिष्ट जेनेरिक प्रकार के साथ एक इटरबल लौटाता है। यह आपको अजीब जानवरों से बचने देता है।

+0

धन्यवाद! बहुत सूचनाप्रद –

7

यदि आपके पास Set है, तो आप के बजाय Sets.filter का उपयोग कर सकते हैं और Set परिणाम प्राप्त कर सकते हैं। SetIterables.filter के परिणाम की तरह एक लाइव व्यू है, लेकिन इसमें Set गुण हैं जैसे तेज contains विधि।

एक प्रतिलिपि केवल तत्वों कि विधेय से मेल युक्त बनाने के लिए, आप ImmutableSet.copyOf या Sets.newHashSet के रूप में दूसरों का सुझाव दिया है का उपयोग कर सकते हैं।

1

आप एक सेट को फ़िल्टर और जावा 8 धाराओं के साथ एक और सेट में एकत्र कर सकते हैं:

Set<Number> integers = numbers.stream() 
    .filter(x -> x instanceof Integer) 
    .collect(Collectors.toSet()); 

लौटे सेट एक प्रति, नहीं एक जीवित दृश्य है।

ध्यान दें कि गुवा के FluentIterable.filter के विपरीत, परिणामस्वरूप सेट Set<Integer> है क्योंकि जावा नहीं जानता कि आपने सभी गैर-पूर्णांक फ़िल्टर किए हैं। यदि आपको Set<Integer>, you have to map after filtering की आवश्यकता है।

Set<Integer> integers = numbers.stream() 
    .filter(x -> x instanceof Integer) 
    .map(x -> (Integer)x) 
    .collect(Collectors.toSet()); 

(आप फिल्टर जोड़ सकता है और एक flatMap में नक्शा है, लेकिन उस पूर्णांक प्रति एक अस्थायी धारा वस्तु का परिचय होता है, और किसी भी अधिक संक्षिप्त नहीं है।)

संबंधित मुद्दे