रूबी में एक ऐरे को दूसरे से घटाना


83

मुझे कार्य के दो सरणियाँ मिली हैं - बनाई और असाइन की गई हैं। मैं बनाए गए कार्यों के सरणी से सभी असाइन किए गए कार्यों को निकालना चाहता हूं। यहाँ मेरा काम है, लेकिन गड़बड़ है, कोड:

    @assigned_tasks = @user.assigned_tasks
    @created_tasks = @user.created_tasks

    #Do not show created tasks assigned to self
    @created_not_doing_tasks = Array.new
    @created_tasks.each do |task|
        unless @assigned_tasks.include?(task)
            @created_not_doing_tasks << task
        end
    end

मुझे यकीन है कि एक बेहतर तरीका है। यह क्या है? धन्यवाद :-)


मैं हुड के नीचे शर्त लगाता हूं कि उत्तर वही है जो आपने वहां कोडित किया है।
baash05

जवाबों:


177

आप रूबी में सरणियों को घटा सकते हैं:

[1,2,3,4,5] - [1,3,4]  #=> [2,5]

ary - other_ary → new_ary Array अंतर

एक नया सरणी देता है जो मूल सरणी की एक प्रति है, जो किसी भी आइटम को हटाकर अन्य_री में भी दिखाई देती है। आदेश मूल सरणी से संरक्षित है।

यह उनके हैश और eql का उपयोग करने वाले तत्वों की तुलना करता है? दक्षता के लिए तरीके।

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]

यदि आपको सेट-जैसे व्यवहार की आवश्यकता है, तो लाइब्रेरी क्लास सेट देखें।

सरणी दस्तावेज़ देखें ।


2
ARG। मेरे लिए बड़ा चेहरा-पल। किसी कारण से मैंने सोचा कि वस्तुओं के साथ काम नहीं करेगा। ठीक काम किया - धन्यवाद!
डॉक्टोरेंज जूल 28'09

28
इसके साथ सावधान रहें, पहले आईआरबी में इसका परीक्षण करें, उदाहरण के लिए: [५, ५, ५, ५] - [५, ५] = [] ... सार में अद्वितीय तत्वों को हटा दिया जाता है।
हॉगोप

9
ध्यान दें, यह काम नहीं करेगा [1,2]-[1,2,3] => []:। लेकिन [1,2,3]-[1,2] => [3]। अरे।
ज़ब्बा

17
यदि आप घटाव के संदर्भ में सोचते हैं तो यह अंतिम "गोच" वास्तव में समझ में आता है। करने के लिए घटाना कुछ आप एक के लिए पूछ नहीं कर रहे हैं diff ... आप एक्स से Y घटाना ... अगर वाई कुछ एक्स में भी नहीं है तो परिणाम 'अपरिभाषित', इसलिए अतिरिक्त वाई तत्व wouldn की तरह है पूछ रहे हैं X- परिणाम में शामिल नहीं किया जाना चाहिए।
बैन

2
विशेष रूप से, Array#-एक सेट अंतर है। यह अधिक Array#|, एक सेट यूनियन का उलटा है , इसकी तुलना में Array#+, संघनन (बिल्कुल एक सेट ऑपरेशन नहीं है!)।
यम्बर्ट

9

उपरोक्त समाधान

a - b

सरणी bसे सरणी में तत्वों के सभी उदाहरणों को हटाता है a

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ]  #=>  [ 3, 3, 5 ]

कुछ मामलों में, आप परिणाम चाहते हैं [1, 2, 3, 3, 5]। यही है, आप सभी डुप्लिकेट को हटाना नहीं चाहते हैं, लेकिन केवल व्यक्तिगत रूप से तत्व।

आप इसे हासिल कर सकते हैं

class Array
  def delete_elements_in(ary)
    ary.each do |x|
      if index = index(x)
        delete_at(index)
      end
    end
  end
end

परीक्षा

irb(main):198:0> a = [ 1, 1, 2, 2, 3, 3, 4, 5 ]
=> [1, 1, 2, 2, 3, 3, 4, 5]
irb(main):199:0> b = [ 1, 2, 4 ]
=> [1, 2, 4]
irb(main):200:0> a.delete_elements_in(b)
=> [1, 2, 4]
irb(main):201:0> a
=> [1, 2, 3, 3, 5]

कोड तब भी काम करता है जब दो सरणियों को क्रमबद्ध नहीं किया जाता है। उदाहरण में, सरणियों को क्रमबद्ध किया जाता है, लेकिन इसकी आवश्यकता नहीं है।


delete_elements_inरूबी उचित (रूबी 2.6.3p62) में उपलब्ध नहीं है
क्यूजप

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