मैं रूबी में चौराहे, संघ और सरणियों का सबसेट कैसे प्राप्त कर सकता हूं?


170

मैं एक वर्ग के लिए अलग तरीके बनाना चाहता हूं जिसे मल्टीसेट कहा जाता है ।

मेरे पास सभी आवश्यक विधियां हैं, लेकिन मैं इस बारे में अनिश्चित हूं कि चौराहे, संघ और उपसमुच्चय विधियों को कैसे लिखा जाए।

चौराहे और संघ के लिए, मेरा कोड इस तरह शुरू होता है:

def intersect(var)
  x = Multiset.new
end

यहाँ एक उदाहरण है:

X = [1, 1, 2, 4]
Y = [1, 2, 2, 2]

तब के चौराहे Xऔर Yहै [1, 2]



@ क्रुएल का लिंक टूट गया है, लेकिन मेरा मानना ​​है कि वह आपको ऐरे की ओर इशारा कर रहा था "और" विधि जो प्रतिच्छेदन करता है, यहां कुछ उत्तर देखें।
रोज़गारपैक

इसका जवाब 8 साल पहले दिया गया था। हां, वह चौराहा, माणिक-doc.org/core-2.6.3/Array.html#method-i-26
क्रुएल

जवाबों:


151

इस तथ्य का उपयोग करते हुए कि आप &(चौराहे), -(अंतर), और |(संघ) करके सरणियों पर संचालन सेट कर सकते हैं ।

जाहिर है मैंने मल्टीसेट को लागू करने के लिए कल्पना नहीं की थी, लेकिन यह आपको शुरू करना चाहिए:

class MultiSet
  attr_accessor :set
  def initialize(set)
    @set = set
  end
  # intersection
  def &(other)
    @set & other.set
  end
  # difference
  def -(other)
    @set - other.set
  end
  # union
  def |(other)
    @set | other.set
  end
end

x = MultiSet.new([1,1,2,2,3,4,5,6])
y = MultiSet.new([1,3,5,6])

p x - y # [2,2,4]
p x & y # [1,3,5,6]
p x | y # [1,2,3,4,5,6]

8
इस उत्तर में 2 बड़े अपराध: (1) setएक सादे सरणी के चर नाम के रूप में शब्द ; (२) Arrayपहले से जो कुछ भी करता है, उसकी पुनरावृत्ति । यदि ओपी Arrayकुछ अतिरिक्त तरीकों के साथ कक्षा में कार्यक्षमता जोड़ना चाहता है , तो आपको बस यह करना चाहिए: class MultiSet < Array def inclusion?(other) Set.new(self).subset?(Set.new(other)) end end
राहुल मुरमुरिया

1
सहमत ... यह शायद सबसे बेकार वर्ग है जिसे मैंने अपने जीवन में देखा है ... लेकिन मुझे एहसास है कि यह वास्तव में आपकी गलती नहीं है।
17

313

मुझे लगता है Xऔर Yसरणियाँ हैं? यदि हां, तो ऐसा करने का एक बहुत ही सरल तरीका है:

x = [1, 1, 2, 4]
y = [1, 2, 2, 2]

# intersection
x & y            # => [1, 2]

# union
x | y            # => [1, 2, 4]

# difference
x - y            # => [4]

स्रोत


17
दूसरे शब्दों में, बस करो Multiset < Array
आरा

यदि आपके पास x = [1,1,2,4] y = [1,2,2,2] z = [4] आप इसे सभी चौराहों के बजाय सेटों के बीच कोई चौराहा देने के लिए कैसे प्राप्त कर सकते हैं? सेट? तो इसके बदले आपको [], यह आपको देता है [1,2,4]?
mharris7190

1
@ mharris7190 आप उन सभी चौराहों के संघ ले सकते हैं:(x & y) | (y & z) | (x & z)
xavdid

2
मत भूलो वहाँ भी है &=, |=और -=अगर आप भी तुरंत मूल्य को स्टोर करना चाहते हैं जैसे मैंने किया! :)
पिसिस

2
वास्तव में जो मैंने सोचा @sawa। ओपी इस वर्ग को पहले स्थान पर क्यों बना रहा है? यह कुछ भी नहीं करता है जो एरे पहले से ही रूबी के मानक लीब से नहीं करता है।
डेनियल्रिककोड्स

6

यदि वर्ग Multisetसे विस्तार होता हैArray

x = [1, 1, 2, 4, 7]
y = [1, 2, 2, 2]
z = [1, 1, 3, 7]

यूनिअन

x.union(y)           # => [1, 2, 4, 7]      (ONLY IN RUBY 2.6)
x.union(y, z)        # => [1, 2, 4, 7, 3]   (ONLY IN RUBY 2.6)
x | y                # => [1, 2, 4, 7]

अंतर

x.difference(y)      # => [4, 7] (ONLY IN RUBY 2.6)
x.difference(y, z)   # => [4] (ONLY IN RUBY 2.6)
x - y                # => [4, 7]

चौराहा

x & y                # => [1, 2]

रूबी 2.6 में नए तरीकों के बारे में अधिक जानकारी के लिए, आप इस ब्लॉग पोस्ट को इसकी नई विशेषताओं के बारे में देख सकते हैं

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