स्विफ्ट 1.2 के रूप में (इस समय बीटा के रूप में उपलब्ध) ऐप्पल Set
संग्रह प्रकार प्रस्तुत करता है।स्विफ्ट में एक सेट से यादृच्छिक तत्व कैसे प्राप्त करें?
var set = Set<Int>(arrayLiteral: 1, 2, 3, 4, 5)
अब मैं इससे बाहर एक यादृच्छिक तत्व प्राप्त करना चाहते हैं:
कहो, मैं की तरह एक सेट है। प्रश्न कैसे है? Set
subscript(Int)
प्रदान नहीं करता है जैसे Array
करता है। इसके बजाय इसमें subscript(SetIndex<T>)
है। लेकिन सबसे पहले, SetIndex<T>
में सुलभ प्रारंभिक नहीं हैं (इसलिए, मैं केवल ऑफसेट के साथ एक इंडेक्स नहीं बना सकता), और दूसरी बात यह भी है कि अगर मैं सेट में पहले तत्व के लिए इंडेक्स प्राप्त कर सकता हूं (var startIndex = set.startIndex
) तो एकमात्र तरीका एन-वें इंडेक्स तक पहुंच सकते हैं लगातार कॉल के माध्यम से successor()
पर जा सकते हैं।
इसलिए, मैं इस समय केवल 2 विकल्प, दोनों बदसूरत और महंगी देख सकते हैं:
- सरणी (
var array = [Int](set)
) में सेट कन्वर्ट और उसके सबस्क्रिप्ट का उपयोग करें (जो पूरी तरह सेInt
स्वीकार करता है); या - किसी सेट में पहले तत्व की अनुक्रमणिका प्राप्त करें, एन-वें अनुक्रमणिका प्राप्त करने के लिए
successor()
विधियों की श्रृंखला को पार करें, और उसके बाद सेट की सबस्क्रिप्ट के माध्यम से संबंधित तत्व पढ़ें।
क्या मुझे किसी अन्य तरीके से याद आती है?
अद्यतन
रूप @rintaro ने कहा, मैं पहले से उपयोग करना चाहिए() फ़ंक्शन तुरंत सूचकांक मैं चाहता हूँ करने के लिए मिलता है। उदा .:
var set = Set<Int>(arrayLiteral: 1, 2, 3, 4, 5)
let randomOffset = Int(arc4random_uniform(UInt32(set.count)))
let random = set[advance(set.startIndex, randomOffset)]
अद्यतन 2
यह पता चला advance()
हे (एन), जो अनिवार्य रूप renders यह बस successor()
की श्रृंखला से गुजरने के बराबर होने का की जटिलता है।
धन्यवाद @rintaro! यही वह है जिसकी तलाश में मैं हूं। – courteouselk