MapSet एक ऐसा संग्रह है जिसमें हर वैल्यू सिर्फ एक बार रखी जाती है, और जो Elixir में सेट को दर्शाता है। इसमें किसी भी तरह की वैल्यू रखी जा सकती है, और इनका कोई क्रम नहीं होता।
ध्यान दीजिए कि Set मॉड्यूल भी मौजूद है, लेकिन अब वह पुराना पड़ चुका है और उसकी जगह MapSet इस्तेमाल करने की सलाह दी जाती है।
आप MapSet.new/0, MapSet.new/1 और MapSet.new/2 की मदद से सेट बना सकते हैं, और MapSet.to_list/1 से उन्हें ऐरे में बदल सकते हैं।
MapSet.new()
# => MapSet.new([])
MapSet.new([2, 3, 3, 3, 1, 1, 2, "hello"])
# => MapSet.new([1, 2, 3, "hello"])
MapSet.new([2, 3, 3, 3, 1, 1, 2], fn n -> 10 * n end)
# => MapSet.new([10, 20, 30])
[2, 3, 3, 3, 1, 1, 2] |> MapSet.new() |> MapSet.to_list()
# => [1, 2, 3]
ध्यान दीजिए कि MapSet में कोई क्रम नहीं होता, इसलिए इसकी कोई गारंटी नहीं है कि MapSet.to_list/1 हमेशा क्रम में लगे एलिमेंट ही लौटाएगा।
आप MapSet.put/2 और MapSet.delete/2 की मदद से एलिमेंट जोड़ या हटा सकते हैं।
आप MapSet.size/1 और MapSet.member?/2 फंक्शन से किसी सेट के बारे में जानकारी ले सकते हैं, और MapSet.equal?/2, MapSet.subset?/2 तथा MapSet.disjoint?/2 से सेटों की तुलना कर सकते हैं।
a = MapSet.new([1, 10])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
MapSet.size(b)
# => 10
MapSet.member?(a, 10)
# => true
MapSet.subset?(a, b)
# => true
MapSet.disjoint?(a, b)
# => false
MapSet को MapSet.union/2, MapSet.intersection/2, MapSet.difference/2 और MapSet.symmetric_difference/2 की मदद से आपस में मिलाया जा सकता है।
a = MapSet.new([1, 10, 100])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
MapSet.union(a, b)
# => MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100])
MapSet.intersection(a, b)
# => MapSet.new([1, 10])
MapSet.difference(a, b)
# => MapSet.new([100])
MapSet.difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9])
MapSet.symmetric_difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9, 100])
आप MapSet.filter/2, MapSet.reject/2 और MapSet.split_with/2 की मदद से सेट को फिल्टर कर सकते हैं और दो हिस्सों में बाँट सकते हैं।
a = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
even = fn n -> rem(n, 2) == 0 end
MapSet.filter(a, even)
# => MapSet.new([2, 4, 6, 8, 10])
MapSet.reject(a, even)
# => MapSet.new([1, 3, 5, 7, 9])
MapSet.split_with(a, even)
# => {MapSet.new([2, 4, 6, 8, 10]), MapSet.new([1, 3, 5, 7, 9])}
Blorkemon™️ कार्डों के लिए आपकी पुरानी यादें अभी भी कम नहीं हो रहीं, आपने तो उन्हें फिर से इकट्ठा करना भी शुरू कर दिया है, और अपने दोस्तों को भी अपने साथ जोड़ रहे हैं।
इस अभ्यास में कार्डों का संग्रह एक MapSet से दर्शाया जाता है, क्योंकि जब आपका लक्ष्य मौजूद सभी कार्ड इकट्ठा करना हो, तो एक जैसे कार्ड महत्व नहीं रखते।
आप चाहते हैं कि आपके दोस्त भी Blorkemon™️ के इस जुनून में शामिल हों, और इसका सबसे अच्छा तरीका है उन्हें एक कार्ड देकर उनका संग्रह शुरू कराना।
GottaSnatchEmAll.new_collection बनाइए, जो एक कार्ड को संग्रह में बदल देता है।
GottaSnatchEmAll.new_collection("Newthree")
# => MapSet.new(["Newthree"])
एक बार संग्रह बन जाने पर वह अपने आप चलने लगता है और उसे बढ़ना ही होता है।
GottaSnatchEmAll.add_card बनाइए, जो एक कार्ड और एक संग्रह लेता है, और दो वैल्यू वाला टपल लौटाता है: एक बूलियन जो बताता है कि कार्ड पहले से संग्रह में था या नहीं, और वह संग्रह जिसमें कार्ड जोड़ दिया गया है।
GottaSnatchEmAll.add_card("Scientuna", MapSet.new(["Newthree"]))
# => {false, MapSet.new(["Newthree", "Scientuna"])}
अब जब आपके दोस्त फिर से Blorkemon™️ के दीवाने हो गए हैं, तो आप कार्डों की अदला-बदली करके अपना संग्रह बढ़ा सकते हैं।
हर अदला-बदली करने लायक नहीं होती, और कुछ तो हो ही नहीं सकतीं। आप उस कार्ड की अदला-बदली नहीं कर सकते जो आपके पास नहीं है, और जो कार्ड आपके पास पहले से है, उसके लिए अदला-बदली नहीं करनी चाहिए।
GottaSnatchEmAll.trade_card बनाइए, जो अदला-बदली के लिए दो कार्ड (आपका और उनका) और आपका मौजूदा संग्रह लेता है।
इसका रिटर्न वैल्यू दो वैल्यू वाला टपल है: एक बूलियन जो बताता है कि अदला-बदली संभव है और करने लायक है या नहीं, और वह संग्रह जो अदला-बदली करने पर आपके पास होता (भले ही वह असल में संभव न हो)।
GottaSnatchEmAll.trade_card("Scientuna", "Newthree", MapSet.new(["Scientuna"]))
# => {true, MapSet.new(["Newthree"])}
पुराने सामान के बाज़ार में आपको कार्डों का एक पुराना जखीरा मिलता है। उस सूची की अपने संग्रह से तुलना करने के लिए आपको कार्डों को क्रम में लगाना है और दोहराए गए कार्ड हटाने हैं।
GottaSnatchEmAll.remove_duplicates बनाइए, जो कार्डों के ऐरे को क्रम में लगाता है और क्रम में लगे, अलग-अलग कार्डों का ऐरे लौटाता है।
GottaSnatchEmAll.remove_duplicates(["Newthree", "Newthree", "Newthree", "Scientuna"])
# => ["Newthree", "Scientuna"]
अब अपने संग्रह के बारे में अच्छा महसूस करने का समय है।
GottaSnatchEmAll.extra_cards बनाइए, जो आपका संग्रह और कोई दूसरा संग्रह लेता है, और उन कार्डों की संख्या लौटाता है जो दूसरे संग्रह में नहीं हैं।
GottaSnatchEmAll.extra_cards(MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"]))
# => 0
आप और Blorkemon™️ के दीवाने दोस्त इकट्ठा होते हैं और सोचते हैं कि सबसे ज़्यादा कौन-से कार्ड मिलते हैं।
GottaSnatchEmAll.boring_cards बनाइए, जो संग्रहों का ऐरे लेता है और उन क्रम में लगे कार्डों का ऐरे लौटाता है जो सभी संग्रहों में हैं।
GottaSnatchEmAll.boring_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => ["Scientuna"]
क्या आपके और आपके दोस्तों के पास मिलकर सारे Blorkemon™️ कार्ड हैं?
GottaSnatchEmAll.total_cards बनाइए, जो संग्रहों का ऐरे लेता है और सभी संग्रहों में मौजूद अलग-अलग कार्डों की कुल संख्या लौटाता है।
GottaSnatchEmAll.total_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => 2
आपका भतीजा जल्द ही आपसे मिलने आ रहा है, और आप उस पर छाप छोड़ना चाहते हैं। बच्चों को चमकदार चीज़ें पसंद होती हैं, है ना? Blorkemon™️ कार्ड चमकदार हो सकते हैं!
GottaSnatchEmAll.split_shiny_cards बनाइए, जो एक संग्रह लेता है और दो क्रम में लगे कार्डों के ऐरे वाला टपल लौटाता है: एक ऐरे उन सभी कार्डों का जो "Shiny" से शुरू होते हैं, और दूसरा बाकी कार्डों का।
GottaSnatchEmAll.split_shiny_cards(MapSet.new(["Newthree", "Scientuna", "Shiny Scientuna"]))
# => {["Shiny Scientuna"], ["Newthree", "Scientuna"]}
Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।