2012-04-02 11 views
7

मैं यादृच्छिक अनुक्रमणिका पुनर्प्राप्त करके एक सरणी जैसी संरचना से यादृच्छिक मान ले सकता हूं।एनएसएससेट उदाहरण से कोई यादृच्छिक वस्तु कैसे प्राप्त करता है?

मैं एनएसएसनेट ऑब्जेक्ट को स्टोर करने वाले एनएसएससेट ऑब्जेक्ट से यादृच्छिक मूल्य कैसे प्राप्त कर सकता हूं? मुझे एनएसएससेट की एक इंस्टेंस विधि नहीं मिली जो एक यादृच्छिक मान प्राप्त करता है।

+2

उपयोग की अपनी पहली सुझाव के साथ जाना होगा फिर से मिलना हो रहा है की आसानी के लिए '[mySet allObjects]' जो एक सरणी वापस आ जाएगी और फिर यादृच्छिक अनुक्रमणिका –

+0

प्राप्त करने के लिए अपने मौजूदा तर्क का उपयोग करें, बीबीएम ने मेरे जवाब में एक बड़ी गलती की, धन्यवाद। हटाए गए। – Almo

+1

क्या आप यादृच्छिक चाहते हैं, या आप बस परवाह नहीं करते हैं? विशेष रूप से, मेरा मतलब है, "क्या आप' - [NSSet anyObject] 'के बारे में जानते हैं? " –

उत्तर

5

संक्षेप में, आप NSSet से सीधे यादृच्छिक वस्तु पुनर्प्राप्त नहीं कर सकते हैं।

आपको या तो एक सरणी में सेट को चालू करने की आवश्यकता है - जिसमें किसी इंडेक्स को यादृच्छिक बनाया जा सकता है - एक सरणी का उपयोग करने के लिए अपने कोड को पुन: आर्किटेक्ट करके या आप इस छद्म कोड का उपयोग करके इसे कार्यान्वित कर सकते हैं :

randomIndex = ...random-generator....(0 .. [set count]); 
__block currentIndex = 0; 
__block selectedObj = nil; 
[set enumerateObjectsWithOptions:^(id obj, BOOL *stop) { 
    if (randomIndex == currentIndex) { selectedObj = obj; *stop = YES } 
    else currentIndex++; 
}]; 
return selectedObj; 

हां - यह ऑब्जेक्ट को पकड़ते समय सेट, संभावित रूप से पूरे सेट को पुन: सक्रिय करता है। हालांकि, यह पुनरावृत्ति काफी है कि एनएसएआरएआरई में रूपांतरण में क्या होगा। जब तक सेट इतना बड़ा न हो और आप इसे पर कॉल नहीं कर रहे हैं तो अक्सर, कोई बड़ा सौदा नहीं होता है।

+0

सामान्य विचार यहां सही है, हालांकि मुझे इसे ट्विक करने और छद्म कोड को कार्यान्वित करने के लिए लागू करने की आवश्यकता है । मेरा संस्करण यहां है: https://gist.github.com/4392708 – Eliot

4

जबकि मुझे लगता है कि @bbum उत्तर stop के उपयोग के कारण गणना के दौरान कुछ मौकों पर जल्दी समाप्त हो जाएगा।

पठनीयता और याद रखता है कि जब आप भविष्य में इस कोड मैं turn the set into an array

NSInteger randomIndex = ..random-generator....(0 .. [set count]) 
id obj = [set count] > 0 ? [[set allObjects] objectAtIndex:randomIndex] : nil; 
संबंधित मुद्दे