2011-01-19 12 views
16

रूबी में, सरणी घटाव या rejectरुबी में, क्या ऐरे में केवल 1 मैच को आसानी से निकालने का कोई तरीका है?

>> [1,3,5,7,7] - [7] 
=> [1, 3, 5] 

>> [1,3,5,7,7].reject{|i| i == 7} 
=> [1, 3, 5] 

सरणी में सभी प्रविष्टियों को हटा देगा। क्या केवल 1 घटना को हटाने में आसान है?

+1

यह बहुत करीब है [ "सरणी से तत्व मिलान का पहला उदाहरण हटाएँ"] (http://stackoverflow.com/questions/4595305/delete-first-instance-of-matching-element-from- सरणी)। –

उत्तर

24
>> a = [1,3,5,7,7] 

>> a.slice!(a.index(7)) 
=> 7 

>> a 
=> [1,3,5,7] 
+2

कोई यह जांचना चाहता है कि '7' वास्तव में मौजूद है, अन्यथा यह एक प्रकार की त्रुटि बढ़ा सकता है। – lulalala

9

सबसे अच्छा मैं के बारे में सोच सकता है:

found = false 
[1,3,5,7,7].reject{|i| found = true if !found && i == 7} 

या विध्वंस:

arr = [1, 2, 3, 5, 7, 7] 
arr.delete_at(arr.index(7)) 
arr #=> [1, 2, 3, 5, 7] 
+0

इसी प्रकार: arr.slice (arr.index (7)) या arr.slice! (Arr.index (7)) – andynu

+1

@andynu: पूर्व कुछ भी नहीं करता है। एक 'टुकड़ा!' इसके लिए काम करता है (क्योंकि यह एक तर्क के साथ बुलाए जाने पर 'delete_at' जैसा ही होता है)। – sepp2k

+1

वैसे, दूसरे समाधान में आपको 'if pos' जोड़ने की भी आवश्यकता हो सकती है, क्योंकि 'delete_at (nil)' exeption फेंकता है। – Nakilon

-4

यह सीधे आपके प्रश्न का उत्तर नहीं करता है, uniq तुम क्या चाहते हो सकता है।

[1,3,5,7,7].uniq # => [1,3,5,7] 
+0

यह थोड़ा आक्रामक है। [1,1,1,1,2,2] .uniq # => [1,2] एक सात से काफी अधिक हटा रहा है। – andynu

+0

यह अन्य सभी डुप्लिकेट तत्वों को भी हटा देता है, यही वह नहीं है जो ओपी चाहता है। – ghostdog74

+0

वैसे मैंने कहा था कि उसने सवाल का जवाब नहीं दिया :) यह अनुमान लगाने की कोशिश करने के लिए मुझे मिलता है कि ओपी क्या है * वास्तव में * करने की कोशिश कर रहा है ... – zetetic

संबंधित मुद्दे

 संबंधित मुद्दे