Saya memiliki sebuah array dari elemen-elemen dalam Ruby
[2,4,6,3,8]
Saya perlu untuk menghapus elemen dengan nilai 3
misalnya
Bagaimana saya melakukan itu?
Pinjaman dari Travis di komentar, ini adalah jawaban yang lebih baik:
saya pribadi suka
[1, 2, 7, 4, 5] - [7]
yang menghasilkan=> [1, 2, 4, 5]
dariirb
Aku dimodifikasi jawabannya melihat bahwa 3 adalah ketiga unsur dalam contoh array. Hal ini dapat menyebabkan kebingungan bagi mereka yang don't menyadari bahwa 3 berada di posisi 2 dalam array.
I'm tidak yakin jika ada orang yang telah menyatakan hal ini, tetapi Array.delete() dan= nilai akan menghapus setiap instance dari nilai yang diteruskan ke dalam Array. Dalam rangka untuk menghapus contoh pertama dari elemen tertentu anda bisa melakukan sesuatu seperti
arr = [1,3,2,44,5]
arr.delete_at(arr.index(44))
#=> [1,3,2,5]
Mungkin ada cara yang lebih sederhana. I'm tidak mengatakan ini adalah praktek terbaik, tapi itu adalah sesuatu yang harus diakui.
Dengan asumsi anda ingin menghapus 3 dengan nilai di beberapa tempat dalam array, Saya pikir ruby cara untuk melakukan tugas ini akan menggunakan delete_if metode:
[2,4,6,3,8,3].delete_if {|x| x == 3 }
Anda juga dapat menggunakan delete_if dalam menghilangkan unsur-unsur dalam skenario 'array'.
Harapan ini menyelesaikan permintaan anda
Saya suka -=[4]
cara yang disebutkan dalam jawaban lain untuk menghapus unsur-unsur yang nilainya adalah 4.
Tapi ada cara ini:
irb(main):419:0> [2,4,6,3,8,6].delete_if{|i|i==6}
=> [2, 4, 3, 8]
irb(main):420:0>
disebutkan di suatu tempat di "Dasar Operasi Array", setelah itu menyebutkan peta
fungsi.
Berikut ini adalah beberapa tolok ukur:
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
Dan lagi dengan yang lebih besar array yang berisi banyak duplikat:
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
Dan bahkan lebih besar dengan lebih banyak duplikat:
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
Anda juga dapat monkey patch ini. Aku tak pernah mengerti mengapa Ruby memiliki kecuali
metode Hash
tapi tidak Array
:
class Array
def except value
value = value.kind_of(Array) ? value : [value]
self - value
end
end
Sekarang anda dapat melakukan:
[1,3,7,"436",354,nil].except(354) #=> [1,3,7,"436",nil]
Atau:
[1,3,7,"436",354,nil].except([354, 1]) #=> [3,7,"436",nil]
Jadi, ketika anda memiliki beberapa kejadian 3 dan anda hanya ingin menghapus kejadian pertama dari 3, anda hanya dapat melakukan beberapa hal seperti di bawah ini.
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.
Jika anda juga ingin membuat penghapusan ini operasi chainable, sehingga anda dapat menghapus beberapa item dan terus chaining operasi pada array yang dihasilkan, menggunakan tap
:
[2, 4, 6, 3, 8].tap { |ary| ary.delete(3) }.count #=> 4