स्विफ्ट सरणी पर संचालन (संघ, प्रतिच्छेदन) सेट करें?


100

क्या कोई मानक पुस्तकालय कॉल है जिसका उपयोग मैं या तो दो सरणियों पर सेट संचालन करने के लिए कर सकता हूं, या स्वयं ऐसे तर्क को लागू कर सकता हूं (आदर्श रूप में कार्यात्मक रूप से और कुशलता से भी संभव है)?


यदि आप इसे स्वयं करना चाहते हैं तो एक सेट को एक शब्दकोश के शीर्ष पर लागू किया जा सकता है।
कोडाफाई जूल 5'14

@CodaFi का मतलब है कि आप अद्वितीयता सुनिश्चित करने के लिए कुंजियों का उपयोग कर रहे हैं?
devios1

क्या आप केवल `शब्दकोश <स्ट्रिंग, शून्य> का उपयोग कर सकते हैं?
डेविड बेरी

जवाबों:


184

हां, स्विफ्ट की Setकक्षा है।

let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]

let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)

स्विफ्ट 3.0+ सेट पर परिचालन कर सकता है:

firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr

स्विफ्ट 2.0 सरणी तर्कों पर गणना कर सकती है:

set1.union(array2)       // {"a", "b", "c", "d"} 
set1.intersect(array2)   // {"a", "b"}
set1.subtract(array2)    // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}

स्विफ्ट 1.2+ सेट पर गणना कर सकता है:

set1.union(set2)        // {"a", "b", "c", "d"}
set1.intersect(set2)    // {"a", "b"}
set1.subtract(set2)     // {"c"}
set1.exclusiveOr(set2)  // {"c", "d"}

यदि आप कस्टम स्ट्रक्चर्स का उपयोग कर रहे हैं, तो आपको हसबरी लागू करने की आवश्यकता है।

स्विफ्ट 2.0 अपडेट के लिए टिप्पणियों में माइकल स्टर्न का धन्यवाद।

हज़बल जानकारी के लिए टिप्पणियों में अमजद हुसैनी का धन्यवाद।


8
ध्यान दें कि, स्विफ्ट 2.0 के रूप में कम से कम, आप इन कार्यों के तर्क के रूप में एक सरणी पास कर सकते हैं। इस प्रकार, set1.union(array2)और set1.exclusiveOr(array2)ऊपर दिखाए गए रूपों के अतिरिक्त, दोनों वैध हैं।
माइकल स्टर्न

यदि आप 5 सरणियों को काटना चाहते हैं तो क्या होगा? या 6? यदि सरणियों की संख्या अज्ञात है तो क्या होगा?
नाथन मैककस्ले

2
@ नथन सेट ऑपरेशन पर निर्भर करता है। उदाहरण के लिए, सेट यूनियन और सेट चौराहे कम्यूटेटिव और एसोसिएटिव हैं, इसलिए आप पुनरावृत्ति या चेनिंग का उपयोग करके कई सेटों को संसाधित कर सकते हैं। या आप कस्टम तरीके बना सकते हैं जो var args का उपयोग करते हैं, जैसे Set Union_all (...) और intersect_all (...)।
joelparkerhenderson

यदि आपके सरणियों में डुप्लिकेट मान हैं, तो उदाहरण के लिए यह निर्धारित करने के लिए कि क्या $ 0 $ 1 का एनाग्राम है जहां इनपुट वर्णों में डुप्लिकेट अक्षर हो सकते हैं?
डेव क्लिमन

1
यदि आप कस्टम स्ट्रक्चर्स का उपयोग कर रहे हैं, तो आपको ह्शेबल के अनुरूप होना चाहिए, जो कि यदि आपके पास एक जटिल संरचना है तो कष्टप्रद हो सकता है
अमजद हुसैनी

0

कोई मानक लाइब्रेरी कॉल नहीं है, लेकिन आप ExSwift लाइब्रेरी को देखना चाहते हैं । इसमें अंतर, चौराहे और संघ सहित Arrays पर नए कार्यों का एक समूह शामिल है।


1
एक सावधान नोट: मैं स्विफ्ट 1.x के लिए निर्गम के बिना ExSwift का उपयोग कर रहा हूं, लेकिन यह स्विफ्ट 2.x के लिए काफी टूट गया है, और जैसा कि इस लेखन को कुछ महीनों में अपडेट नहीं किया गया है। एक टन कांटे हैं जिन पर अधिक ध्यान दिया जा सकता है।
रॉबिन माक्रग सेप


0

मुझे पता है कि सबसे कुशल विधि गोडेल संख्याओं का उपयोग करके है। Google को एन्कोडिंग के लिए।

विचार तो है। मान लीजिए कि आपके पास एन संभव संख्याएं हैं और उनमें से सेट बनाने की आवश्यकता है। उदाहरण के लिए, N = 100,000 और {1,2,3}, {5, 88, 19000} आदि जैसे सेट बनाना चाहते हैं।

यह विचार एन प्राइम नंबरों की सूची को स्मृति में रखने के लिए है और दिए गए सेट के लिए {a, b, c, ...} आप के लिए सांकेतिक शब्दों में बदलना

 prime[a]*prime[b]*prime[c]*...

तो आप एक सेट को BigNumber के रूप में एन्कोड करते हैं। इस तथ्य के बावजूद कि वे इंटेगर के साथ संचालन की तुलना में धीमी हैं, बिगएनुयर्स के साथ संचालन अभी भी बहुत तेज है।

2 सेट ए, बी को एकजुट करने के लिए, आप लेते हैं

  UNITE(A, B) = lcm(a, b)

A और B के रूप में सबसे कम-एकाधिक-एक सेट और दोनों संख्याएँ हैं।

चौराहा बनाने के लिए आप ले लो

 INTERSECT(A, B) = gcd (a, b)

महत्तम सामान्य भाजक।

और इसी तरह।

इस एन्कोडिंग को ईश्वरीयकरण कहा जाता है, आप अधिक के लिए Google कर सकते हैं, फ्रीज के तर्क का उपयोग करके लिखी गई अंकगणित की सभी भाषा को इस तरह से संख्याओं का उपयोग करके एन्कोड किया जा सकता है।

ऑपरेशन करने के लिए सदस्य है? यह बहुत ही सरल है --

ISMEMBER(x, S) = remainder(s,x)==0

कार्डिनल प्राप्त करने के लिए यह थोड़ा अधिक जटिल है -

CARDINAL(S) = # of prime factors in s

आप प्रमुख कारकों के उत्पाद में सेट का प्रतिनिधित्व करने वाली संख्या S को विघटित करते हैं और उनके घातांक जोड़ते हैं। मामले में सेट डुप्लिकेट की अनुमति नहीं देता है, तो आपके पास सभी एक्सपोर्टर 1 होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.