2015-07-24 6 views
11

हैं मेरे पास एक जावा 8 स्ट्रीम है जिसमें से मैं (समान रूप से) एक तत्व को यादृच्छिक रूप से चुनना चाहता हूं। स्ट्रीम में शून्य से दस हजार तत्वों के कहीं भी हो सकते हैं।क्या मैं जांच सकता हूं कि जावा 8 स्ट्रीम में कम से कम एन तत्व

मैंने एक एल्गोरिदम लागू किया है जो मैपरेडस-जैसी पैटर्न का उपयोग करके एक का चयन करता है, लेकिन बहुत छोटी धाराओं के लिए यह शायद सूची में आइटम एकत्र करने और यादृच्छिक अनुक्रमणिका के साथ एक को वापस करने के लिए अधिक कुशल होगा। इसके लिए मुझे उन्हें गिनना है, हालांकि। स्ट्रीम में एक गिनती() विधि होती है लेकिन यह उन सभी की गणना करता है, मुझे वास्तव में वास्तविक गिनती में दिलचस्पी नहीं है, मुझे इसकी परवाह है कि यह एक निर्धारित संख्या से अधिक है या नहीं। क्या किसी को पता है कि ऐसी विधि मौजूद है या नहीं? मुझे यह नहीं मिल रहा है लेकिन ऐसा कुछ भी हो सकता है जिसे मैं देख रहा हूं या फिर भी इसे खोजने के लिए कुछ चालाक चाल हो सकता है।

पीएस .: मुझे पता है कि कभी-कभी कोड को अनुकूलित करने के लिए आवश्यक नहीं है; लेकिन मैं अनुभव के लिए, फिर भी कोशिश करना चाहूंगा। मैं एक विद्यार्थी हूं.

पी पी एस: मैं अपने एल्गोरिथ्म यहाँ कॉपी किया है, मामले में किसी को भी रुचि है (या कीड़े के लिए दिखना चाहता है, मैं इसे अभी तक ;-)

stream 
    .parallel() 
    .map(t -> new Pair<T, Integer>(t, 1)) 
    .reduce((Pair<T, Integer> t, Pair<T, Integer> u) -> { 
     if (rand.nextDouble() <= (t.getValue1()/(double) (t.getValue1() + u.getValue1()))) { 
      return new Pair<>(t.getValue0(), t.getValue1() + u.getValue1()); 
     } else { 
      return new Pair<>(u.getValue0(), t.getValue1() + u.getValue1()); 
     } 
    }) 
    .map(t -> t.getValue0()); 

परीक्षण नहीं किया (जोड़े संगठन से कर रहे हैं। javatuples, अब जावा कार्यात्मक प्रोग्रामिंग का समर्थन करता है जैसे इंटरफेस tuples की कमी थोड़ा दर्दनाक हो जाता है)।

+0

यह देखते हुए कि एक स्ट्रीम केवल एक बार पढ़ने वाली धारा हो सकती है, और यह नहीं जानता कि कोई अन्य तत्व उपलब्ध है या नहीं, जब तक कि यह पढ़ा न जाए, मैं ' टी देखें कि इस तरह की गिनती सभी मामलों में कैसे काम कर सकती है। व्यक्तिगत रूप से मैं आपके एल्गोरिदम को मानचित्र/कम प्रकार के चरण के माध्यम से नहीं लिखूंगा - मैं बस इस तरह के कोड का उपयोग करूंगा: http://stackoverflow.com/questions/966108/choose-random-array-element-sisfisfying-certain-property/966118 # 9 66118 एक इटरेटर के साथ। –

+0

आपके उत्तर के लिए धन्यवाद। मेरे पास यह था, लेकिन मैंने नहीं देखा कि एक धारा को एक पुनरावर्तक में परिवर्तित करना संभव है। सूचक के लिए धन्यवाद। –

+0

"बहुत छोटी धाराओं के लिए यह शायद सूची में आइटम एकत्र करने के लिए अधिक कुशल होगा।" क्यूं कर? –

उत्तर

0

मैं सुझाव देता हूं कि स्ट्रीम के लिए डेटा के स्रोत से यह जानकारी प्राप्त करने का प्रयास करें। स्ट्रीम से डेटा कहां से मिलता है? यदि स्रोत (उदाहरण के लिए कुछ संग्रह) आपको सेट किए गए तत्वों की संख्या दे सकता है। यदि यह कुछ निर्माता फ़ंक्शन है तो यह जांचें कि यह क्या करता है और क्या आकार का अनुमान लगाने के लिए संभव है।

जिस क्षण मैं "स्ट्रीम" टाइप करता हूं, मैं सामान्य रूप से वास्तविक डेटा की बजाय इस डेटा के साथ क्या करना चाहता हूं, "नुस्खा" के बारे में सोचना शुरू करता हूं। मुझे लगता है कि धाराओं के तरीके के करीब है (जो बताता है कि वे तत्वों को गिनने का तरीका क्यों नहीं देते हैं)।

सर्वश्रेष्ठ संबंध, डीडो

1

आपका कोड समान वितरण से तत्व नहीं लौटाता है। यह आदेश पर निर्भर करता है, वह धारा विधि को कम करने के लिए तत्व प्रदान करती है। सामान्य स्थिति में आप इस बात पर विचार नहीं कर सकते कि आदेश विशेष नहीं होगा। अपने कार्य को हल करना: यदि आपके पास पर्याप्त स्मृति है, तो RandomComparator (जो पिछले परिणामों को मानचित्र में सहेजता है) लिखना संभव है, अपनी स्ट्रीम को इस तुलनित्र के साथ सॉर्ट करें और पहले तत्व प्राप्त करें (findAny का उपयोग न करें)। यदि स्ट्रीम बहुत बड़ी है, तो इसे RandomFilter के साथ नमूना देना संभव है।

बीटीडब्ल्यू, यदि आपके स्ट्रीम में SIZED ध्वज है, तो कार्य छोटा है। बस आकार प्राप्त करें, यादृच्छिक अनुक्रमणिका उत्पन्न करें और स्पिप बनाएं :)

+0

क्या आप विस्तारित कर सकते हैं कि यह गलत जवाब क्यों देता है? मैंने थोड़ी देर के लिए इस सवाल के बारे में नहीं सोचा है, लेकिन मुझे नहीं लगता कि मैपरेडस एल्गोरिदम गलत परिणाम क्यों देगा? –

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