2011-11-01 18 views
6

delete_at केवल एक ही अनुक्रमणिका लेता है। अंतर्निहित तरीकों का उपयोग करके इसे हासिल करने का एक अच्छा तरीका क्या है? को सेट नहीं होना चाहिए, इंडेक्स की एक सरणी भी हो सकती है।इंडेक्स के सेट के आधार पर सरणी की सामग्री हटाएं

arr = ["a", "b", "c"] 
set = Set.new [1, 2] 
arr.delete_at set 
# => arr = ["a"] 
+0

जरूरी एक में जगह संशोधन होना चाहिए? – tokland

+0

मुझे लगता है कि आप किसी अन्य सरणी का उपयोग करने के बजाय, विशिष्टता सुनिश्चित करने के लिए 'Set.new' में सेट प्रकार का उपयोग कर रहे हैं? – Mirv

उत्तर

12

एक-लाइनर:

arr.delete_if.with_index { |_, index| set.include? index } 
+0

बस एक नोट, क्योंकि '_' अंडरस्कोर प्रतीक की खोज करना मुश्किल है - यह प्लेसहोल्डर है आमतौर पर इसका उपयोग किया जाता है यदि आप केवल इंडेक्स को अनदेखा करने जा रहे हैं। '_' एक वैध चर है, लेकिन कोड लाइन इसके साथ कुछ भी नहीं जा रही है। – Mirv

1

इस प्रयास करें:

arr.reject { |item| set.include? arr.index(item) } # => [a] 

यह थोड़ा बदसूरत, मुझे लगता है कि है;) हो सकता है कि किसी को एक बेहतर समाधान का सुझाव?

+0

मेरी समस्या के लिए एक आसान समाधान, जबकि अन्य विफल! – dariush

4

ऐरे क्लास को फिर से खोलें और इसके लिए एक नई विधि जोड़ें।

class Array 

    def delete_at_multi(arr) 
    arr = arr.sort.reverse # delete highest indexes first. 
    arr.each do |i| 
     self.delete_at i 
    end 
    self 
    end 

end 

arr = ["a", "b", "c"] 
set = [1, 2] 

arr.delete_at_multi(set) 

arr # => ["a"] 

यदि आप कक्षा को फिर से खोलना नहीं चाहते हैं तो यह निश्चित रूप से स्टैंड-अलोन विधि के रूप में लिखा जा सकता है। यह सुनिश्चित करना कि इंडेक्स रिवर्स ऑर्डर में हैं, अन्यथा आप उस सरणी में बाद में तत्वों की स्थिति बदलते हैं जिन्हें हटाया जाना चाहिए।

+0

+1, लेकिन * delete_at_indices * एक बेहतर नाम होगा: यह delete_at की पठनीयता को बरकरार रखता है, लेकिन फिर भी यह स्पष्ट करता है कि इसमें कई इंडेक्स लगते हैं। जहां तक ​​पठनीयता है, आप "3 पर ​​हटाएं" या "इंडेक्स 3, 5, और 7 पर हटाएं" कह सकते हैं लेकिन आप "मल्टी 3, 5, और 7 पर हटाएं" नहीं कहेंगे। (और निश्चित रूप से, उन लोगों के लिए जो "इंडेक्स" शब्द का उपयोग करने के बारे में पैडेंटिक नहीं हैं, वहां एक उपनाम * delete_at_indexes * हो सकता है;) – iconoclast

0

कार्यात्मक दृष्टिकोण:

class Array 
    def except_values_at(*indexes) 
    ([-1] + indexes + [self.size]).sort.each_cons(2).flat_map do |idx1, idx2| 
     self[idx1+1...idx2] || [] 
    end 
    end 
end 

>> ["a", "b", "c", "d", "e"].except_values_at(1, 3) 
=> ["a", "c", "e"] 
संबंधित मुद्दे