Array#drop删除数组的第一个 n 元素。删除数组的最后 m 元素有什么好方法?或者,保持数组中间元素(大于 n ,小于 m )的好方法是什么?
答案 0 :(得分:21)
这正是Array#pop
的用途:
x = [1,2,3]
x.pop(2) # => [2,3]
x # => [1]
答案 1 :(得分:7)
您也可以使用Array#slice方法,例如:
[1,2,3,4,5,6].slice(1..4) # => [2, 3, 4, 5]
或
a = [1,2,3,4,5,6]
a.take 3 # => [1, 2, 3]
a.first 3 # => [1, 2, 3]
a.first a.size - 1 # to get rid of the last one
答案 2 :(得分:2)
与drop
(删除前n个元素)最直接相反的是take
,它保留前n个元素(还有take_while
类似于{{1} })。
Slice允许您通过指定范围或偏移量和长度来返回数组的子集。当作为参数传递范围或传递2个数字
时,数组#[]的行为相同答案 3 :(得分:1)
这将消除最后n个元素:
a = [1,2,3,4,5,6]
n = 4
p a[0, (a.size-n)]
#=> [1, 2]
n = 2
p a[0, (a.size-n)]
#=> [1, 2, 3, 4]
关注“中间”元素:
min, max = 2, 5
p a.select {|v| (min..max).include? v }
#=> [2, 3, 4, 5]
答案 4 :(得分:0)
您可以以非破坏性的方式实现与Array#pop
相同的操作,而无需了解数组的长度:
a = [1, 2, 3, 4, 5, 6]
b = a[0..-2]
# => [1, 2, 3, 4, 5]
n = 3 # if we want drop the last n elements
c = a[0..-(n+1)]
# => [1, 2, 3]
答案 5 :(得分:0)
我希望返回值是没有删除元素的数组。我在这里找到了几种解决方案:
count = 2
[1, 2, 3, 4, 5].slice 0..-(count + 1) # => [1, 2, 3]
[1, 2, 3, 4, 5].tap { |a| a.pop count } # => [1, 2, 3]
但是我发现,如果数组的顺序并不重要(在我的情况下,我正在删除文件),则另一种解决方案更具可读性:
count = 2
[1, 2, 3, 4, 5].reverse.drop count # => [3, 2, 1]
如果您需要保留订单,可以在该处附加另一个.reverse
,但我认为我现在更喜欢tap
解决方案。
答案 6 :(得分:0)
Array#delete_at() 是删除数组最后一个元素的最简单方法,也是如此
arr = [1,2,3,4,5,6]
arr.delete_at(-1) # => [1,2,3,4,5]
要删除数组的一个或多个片段,请使用其他答案中的方法。
答案 7 :(得分:-2)
您还可以添加一些方法
class Array
# Using slice
def cut(n)
slice(0..-n-1)
end
# Using pop
def cut2(n)
dup.tap{|x| x.pop(n)}
end
# Using take
def cut3(n)
length - n >=0 ? take(length - n) : []
end
end
[1,2,3,4,5].cut(2)
=> [1, 2, 3]