मैं रूबी में तत्वों की एक सरणी है
[2,4,6,3,8]
मुझे 3
उदाहरण के लिए मान वाले तत्वों को निकालने की आवश्यकता है
मैं उसको कैसे करू?
active record
विधि के कारण हो सकता हैdelete
मैं रूबी में तत्वों की एक सरणी है
[2,4,6,3,8]
मुझे 3
उदाहरण के लिए मान वाले तत्वों को निकालने की आवश्यकता है
मैं उसको कैसे करू?
active record
विधि के कारण हो सकता हैdelete
जवाबों:
मुझे लगता है कि मैंने इसका पता लगा लिया है:
a = [3, 2, 4, 6, 3, 8]
a.delete(3)
#=> 3
a
#=> [2, 4, 6, 8]
[1, 2, 3, 4, 5] - [3]
में परिणाम जो => [1, 2, 4, 5]
से irb
।
delete
जबकि -
आपको वापस कर दिया गया है) अंतर्निहित सरणी को बदल देता है । आपके उपयोग के मामले के आधार पर या तो दृष्टिकोण समझ में आ सकता है।
टिप्पणियों में ट्रैविस से उधार लेना , यह एक बेहतर जवाब है:
मैं व्यक्तिगत रूप से की तरह
[1, 2, 7, 4, 5] - [7]
है, जिसमें परिणाम=> [1, 2, 4, 5]
सेirb
मैंने उनके उत्तर को यह देखकर संशोधित किया कि 3 उनके उदाहरण सरणी में तीसरा तत्व था। यह उन लोगों के लिए कुछ भ्रम पैदा कर सकता है जिन्हें यह एहसास नहीं है कि 3 सरणी में स्थिति 2 में है।
.delete
और बनाने के बीच एक महत्वपूर्ण अंतर है -
। .delete
वह मान लौटाएगा जो ऐरे से निकाला गया था, यदि कोई हो; -
नहीं होगा। तो [ 1, 2, 3 ] - [ 2 ]
लौटेगा [ 1, 3 ]
, जबकि [ 1, 2, 3 ].delete( 2 )
लौटेगा 2
।
array - subArray
ऐरे के एरे के लिए काम नहीं करेगा , लेकिन array.delete(subArray)
करेगा।
[1,2,3] - [2]
और [1,2,3].delete(2)
वह delete
तरीका मूल सरणी को संशोधित करता है , जबकि [1,2,3] - [3]
एक नया सरणी बनाता है ।
[1,2,[2],2,3,4] - [2]
आपको देता है [1, [2], 3, 4]
, लेकिन [1,2,[2],2,3,4] - [[2]]
आपको देता है [1, 2, 2, 3, 4]
। :-)
मुझे यकीन नहीं है कि किसी ने भी यह कहा है, लेकिन Array.delete () और - = मान ऐरे के भीतर इसके पास दिए गए मूल्य के हर उदाहरण को हटा देगा। विशेष तत्व के पहले उदाहरण को हटाने के लिए आप कुछ ऐसा कर सकते हैं
arr = [1,3,2,44,5]
arr.delete_at(arr.index(44))
#=> [1,3,2,5]
एक सरल तरीका हो सकता है। मैं यह नहीं कह रहा हूं कि यह सबसे अच्छा अभ्यास है, लेकिन यह कुछ ऐसा है जिसे पहचाना जाना चाहिए।
nil
मान लें कि आप किसी सरणी में कई स्थानों पर मान द्वारा 3 को हटाना चाहते हैं, मुझे लगता है कि इस कार्य को करने के लिए माणिक तरीका delete_if पद्धति का उपयोग करना होगा:
[2,4,6,3,8,3].delete_if {|x| x == 3 }
आप 'सरणी के सरणी' के परिदृश्य में तत्वों को हटाने में भी delete_if का उपयोग कर सकते हैं।
आशा है कि यह आपकी क्वेरी को हल करता है
मैं -=[4]
उन तत्वों को हटाने के लिए अन्य उत्तर में वर्णित तरीका पसंद करता हूं जिनके मूल्य 4 हैं।
लेकिन इस तरह से है:
irb(main):419:0> [2,4,6,3,8,6].delete_if{|i|i==6}
=> [2, 4, 3, 8]
irb(main):420:0>
" बेसिक एरे ऑपरेशंस " में कहीं उल्लेख किया गया है , क्योंकि यह map
फ़ंक्शन का उल्लेख करता है।
.delete(6)
-=
तरीका है । a-=[4]
यानी , जो मैंने कहा कि मुझे पसंद है), लेकिन मैं एक और संभावित तरीके का उल्लेख करना चाहता था। a=a-[4]
[3,4]-[4]
.delete_at(3)
3
यहाँ एक स्थिति है।
यहाँ कुछ बेंचमार्क हैं:
require 'fruity'
class Array
def rodrigo_except(*values)
self - values
end
def niels_except value
value = value.kind_of?(Array) ? value : [value]
self - value
end
end
ARY = [2,4,6,3,8]
compare do
soziev { a = ARY.dup; a.delete(3); a }
steve { a = ARY.dup; a -= [3]; a }
barlop { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
rodrigo { a = ARY.dup; a.rodrigo_except(3); }
niels { a = ARY.dup; a.niels_except(3); }
end
# >> Running each test 4096 times. Test will take about 2 seconds.
# >> soziev is similar to barlop
# >> barlop is faster than steve by 2x ± 1.0
# >> steve is faster than rodrigo by 4x ± 1.0
# >> rodrigo is similar to niels
और फिर से एक बड़े सरणी के साथ जिसमें बहुत सारे डुप्लिकेट हैं:
class Array
def rodrigo_except(*values)
self - values
end
def niels_except value
value = value.kind_of?(Array) ? value : [value]
self - value
end
end
ARY = [2,4,6,3,8] * 1000
compare do
soziev { a = ARY.dup; a.delete(3); a }
steve { a = ARY.dup; a -= [3]; a }
barlop { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
rodrigo { a = ARY.dup; a.rodrigo_except(3); }
niels { a = ARY.dup; a.niels_except(3); }
end
# >> Running each test 16 times. Test will take about 1 second.
# >> steve is faster than soziev by 30.000000000000004% ± 10.0%
# >> soziev is faster than barlop by 50.0% ± 10.0%
# >> barlop is faster than rodrigo by 3x ± 0.1
# >> rodrigo is similar to niels
और भी अधिक डुप्लिकेट के साथ बड़ा:
class Array
def rodrigo_except(*values)
self - values
end
def niels_except value
value = value.kind_of?(Array) ? value : [value]
self - value
end
end
ARY = [2,4,6,3,8] * 100_000
compare do
soziev { a = ARY.dup; a.delete(3); a }
steve { a = ARY.dup; a -= [3]; a }
barlop { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
rodrigo { a = ARY.dup; a.rodrigo_except(3); }
niels { a = ARY.dup; a.niels_except(3); }
end
# >> Running each test once. Test will take about 6 seconds.
# >> steve is similar to soziev
# >> soziev is faster than barlop by 2x ± 0.1
# >> barlop is faster than niels by 3x ± 1.0
# >> niels is similar to rodrigo
मैंने नील्स के समाधान में सुधार किया
class Array
def except(*values)
self - values
end
end
अब आप उपयोग कर सकते हैं
[1, 2, 3, 4].except(3, 4) # return [1, 2]
[1, 2, 3, 4].except(4) # return [1, 2, 3]
irb
कंसोल पर काम नहीं कर रहा आपका समाधान2.2.1 :007 > [1, 2, 3, 4].except(3, 4) NoMethodError: undefined method except for [1, 2, 3, 4]:Array from (irb):7 from /usr/share/rvm/rubies/ruby-2.2.1/bin/irb:11:in <main>
class Array; def except(*values); self - values; end; end
।
आप इसे पैच भी कर सकते हैं। मुझे कभी समझ में नहीं आया कि रूबी के लिए एक except
विधि क्यों है , Hash
लेकिन इसके लिए नहीं Array
:
class Array
def except value
value = value.kind_of(Array) ? value : [value]
self - value
end
end
अब आप कर सकते हैं:
[1,3,7,"436",354,nil].except(354) #=> [1,3,7,"436",nil]
या:
[1,3,7,"436",354,nil].except([354, 1]) #=> [3,7,"436",nil]
value.kind_of(Array)
परीक्षण की आवश्यकता नहीं है । बस उपयोग करें self - Array(value)
।
इसलिए जब आपके पास 3 की कई घटनाएं होती हैं और आप केवल 3 की पहली घटना को हटाना चाहते हैं, तो आप बस नीचे के रूप में कुछ काम कर सकते हैं।
arr = [2, 4, 6, 3, 8, 10, 3, 12]
arr.delete_at arr.index 3
#This will modify arr as [2, 4, 6, 8, 10, 3, 12] where first occurrence of 3 is deleted. Returns the element deleted. In this case => 3.
माणिक में हटाने के लिए सभी विभिन्न विकल्पों का संकलन
हटाएं - मिलान वाले तत्वों को मान से हटाता है। यदि एक से अधिक मान मेल खाते हैं, तो यह सभी को निकाल देगा। यदि आप घटना की संख्या के बारे में परवाह नहीं करते हैं या एकल घटना के बारे में निश्चित नहीं हैं, तो इस विधि का उपयोग करें।
a = [2, 6, 3, 5, 3, 7]
a.delete(3) # returns 3
puts a # return [2, 6, 5, 7]
delete_at - दिए गए सूचकांक में तत्व हटाता है। यदि आप जानते हैं कि सूचकांक इस विधि का उपयोग करता है।
# continuing from the above example
a.delete_at(2) # returns 5
puts a # returns [2, 6, 7]
delete_if - प्रत्येक तत्व को हटाता है जिसके लिए ब्लॉक सत्य है। यह सरणी को संशोधित करेगा। ब्लॉक कहा जाता है के रूप में सरणी तुरंत बदल जाता है।
b = [1, 2, 5, 4, 9, 10, 11]
b.delete_if {|n| n >= 10}. # returns [1, 2, 5, 4, 9]
अस्वीकार - यह नए एरे को उन तत्वों के साथ लौटाएगा जिनके लिए दिए गए ब्लॉक गलत है। इस के साथ आदेश बनाए रखा जाता है।
c = [1, 2, 5, 4, 9, 10, 11]
c.reject {|n| n >= 10}. # returns [1, 2, 5, 4, 9]
अस्वीकार! - delete_if के समान । हो सकता है कि ब्लॉक कहे जाने पर एरियर तुरंत न बदले।
यदि आप कई मानों को सरणी से हटाना चाहते हैं, तो सबसे अच्छा विकल्प bellow है।
a = [2, 3, 7, 4, 6, 21, 13]
b = [7, 21]
a = a - b # a - [2, 3, 4, 6, 13]
delete
array.delete(3)
रेल नियंत्रक पर माणिक के भीतर काम क्यों नहीं किया जाता है