Tôi có một loạt các yếu tố trong Ruby
[2,4,6,3,8]
Tôi cần loại bỏ các yếu tố có giá trị 3
chẳng hạn
Làm thế nào để làm điều đó?
active record
phương phápdelete
Tôi có một loạt các yếu tố trong Ruby
[2,4,6,3,8]
Tôi cần loại bỏ các yếu tố có giá trị 3
chẳng hạn
Làm thế nào để làm điều đó?
active record
phương phápdelete
Câu trả lời:
Tôi nghĩ rằng tôi đã tìm ra nó:
a = [3, 2, 4, 6, 3, 8]
a.delete(3)
#=> 3
a
#=> [2, 4, 6, 8]
[1, 2, 3, 4, 5] - [3]
kết quả => [1, 2, 4, 5]
từ irb
.
delete
đổi mảng bên dưới trong khi -
tạo ra một mảng mới (được trả về cho bạn) mà không có giá trị bị xóa. Tùy thuộc vào trường hợp sử dụng của bạn, một trong hai cách tiếp cận có thể có ý nghĩa.
Mượn từ Travis trong các bình luận, đây là một câu trả lời tốt hơn:
Cá nhân tôi thích
[1, 2, 7, 4, 5] - [7]
kết quả=> [1, 2, 4, 5]
từirb
Tôi đã sửa đổi câu trả lời của anh ấy khi thấy rằng 3 là phần tử thứ ba trong mảng mẫu của anh ấy. Điều này có thể dẫn đến một số nhầm lẫn cho những người không nhận ra rằng 3 ở vị trí 2 trong mảng.
.delete
và -
. .delete
sẽ trả về giá trị đã bị xóa khỏi Array, nếu có; -
sẽ không. Như vậy [ 1, 2, 3 ] - [ 2 ]
sẽ trở lại [ 1, 3 ]
, trong khi [ 1, 2, 3 ].delete( 2 )
sẽ trở lại 2
.
array - subArray
sẽ không hoạt động cho Mảng mảng , nhưng array.delete(subArray)
sẽ làm được.
[1,2,3] - [2]
và [1,2,3].delete(2)
là delete
phương thức đó sửa đổi mảng ban đầu , trong khi [1,2,3] - [3]
tạo ra một mảng mới .
[1,2,[2],2,3,4] - [2]
cung cấp cho bạn [1, [2], 3, 4]
, nhưng [1,2,[2],2,3,4] - [[2]]
cung cấp cho bạn [1, 2, 2, 3, 4]
. :-)
Tôi không chắc có ai đã tuyên bố điều này chưa, nhưng Array.delete () và - = value sẽ xóa mọi phiên bản của giá trị được truyền cho nó trong Array. Để xóa phiên bản đầu tiên của phần tử cụ thể, bạn có thể làm một cái gì đó như
arr = [1,3,2,44,5]
arr.delete_at(arr.index(44))
#=> [1,3,2,5]
Có thể có một cách đơn giản hơn. Tôi không nói rằng đây là cách thực hành tốt nhất, nhưng nó là thứ cần được công nhận.
nil
Giả sử bạn muốn xóa 3 theo giá trị tại nhiều vị trí trong một mảng, tôi nghĩ cách thức ruby để thực hiện tác vụ này sẽ là sử dụng phương thức xóa_if:
[2,4,6,3,8,3].delete_if {|x| x == 3 }
Bạn cũng có thể sử dụng remove_if trong việc xóa các phần tử trong kịch bản 'mảng của mảng'.
Hy vọng điều này giải quyết truy vấn của bạn
Tôi thích -=[4]
cách được đề cập trong các câu trả lời khác để xóa các yếu tố có giá trị là 4.
Nhưng có cách này:
irb(main):419:0> [2,4,6,3,8,6].delete_if{|i|i==6}
=> [2, 4, 3, 8]
irb(main):420:0>
đã đề cập ở đâu đó trong " Các hoạt động mảng cơ bản ", sau khi nó đề cập đến map
chức năng.
.delete(6)
-=
cách a-=[4]
ví dụ a=a-[4]
. [3,4]-[4]
, Mà tôi nói tôi thích), nhưng tôi muốn đề cập đến một cách khác có thể.
Dưới đây là một số điểm chuẩn:
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
Và một lần nữa với một mảng lớn hơn chứa nhiều bản sao:
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
Và thậm chí lớn hơn với nhiều bản sao hơn:
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
Tôi đã cải thiện giải pháp của Niels
class Array
def except(*values)
self - values
end
end
Bây giờ bạn có thể sử dụng
[1, 2, 3, 4].except(3, 4) # return [1, 2]
[1, 2, 3, 4].except(4) # return [1, 2, 3]
irb
bảng điều khiển 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
.
Bạn cũng có thể khỉ vá nó. Tôi không bao giờ hiểu tại sao Ruby có một except
phương thức cho Hash
nhưng không phải cho Array
:
class Array
def except value
value = value.kind_of(Array) ? value : [value]
self - value
end
end
Bây giờ bạn có thể làm:
[1,3,7,"436",354,nil].except(354) #=> [1,3,7,"436",nil]
Hoặc là:
[1,3,7,"436",354,nil].except([354, 1]) #=> [3,7,"436",nil]
value.kind_of(Array)
kiểm tra. Chỉ cần sử dụng self - Array(value)
.
Vì vậy, khi bạn có nhiều lần xuất hiện của 3 và bạn chỉ muốn xóa lần xuất hiện đầu tiên của 3, bạn chỉ cần làm một số việc như dưới đây.
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.
Tổng hợp tất cả các tùy chọn khác nhau để xóa trong ruby
xóa - Xóa các yếu tố phù hợp theo giá trị. Nếu nhiều hơn một giá trị khớp với nó sẽ loại bỏ tất cả. Nếu bạn không quan tâm đến số lần xuất hiện hoặc chắc chắn về sự xuất hiện đơn lẻ, hãy sử dụng phương pháp này.
a = [2, 6, 3, 5, 3, 7]
a.delete(3) # returns 3
puts a # return [2, 6, 5, 7]
xóa_at - Xóa phần tử tại chỉ mục đã cho. Nếu bạn biết chỉ số sử dụng phương pháp này.
# continuing from the above example
a.delete_at(2) # returns 5
puts a # returns [2, 6, 7]
xóa_if - Xóa mọi phần tử cho khối nào là đúng. Điều này sẽ sửa đổi các mảng. Mảng thay đổi ngay lập tức khi khối được gọi.
b = [1, 2, 5, 4, 9, 10, 11]
b.delete_if {|n| n >= 10}. # returns [1, 2, 5, 4, 9]
từ chối - Điều này sẽ trả về mảng mới với các phần tử mà khối đã cho là sai. Việc đặt hàng được duy trì với điều này.
c = [1, 2, 5, 4, 9, 10, 11]
c.reject {|n| n >= 10}. # returns [1, 2, 5, 4, 9]
Từ chối! - giống như xóa_if . Mảng có thể không thay đổi ngay lập tức khi khối được gọi.
Nếu bạn muốn xóa nhiều giá trị khỏi mảng, tùy chọn tốt nhất là dưới đây.
a = [2, 3, 7, 4, 6, 21, 13]
b = [7, 21]
a = a - b # a - [2, 3, 4, 6, 13]
delete
array.delete(3)
không hoạt động trong bộ điều khiển ruby trên đường ray