Array#drop可以删除数组中的前n个元素。那么,有什么好方法可以删除数组的最后m个元素?或者,有什么好方法可以保留数组的中间元素(大于n,小于m)?
Array#drop可以删除数组中的前n个元素。那么,有什么好方法可以删除数组的最后m个元素?或者,有什么好方法可以保留数组的中间元素(大于n,小于m)?
这正是 Array#pop
的用途:
x = [1,2,3]
x.pop(2) # => [2,3]
x # => [1]
[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
Array#slice!
,当需要原地修改数组时可以使用。 - Victor DeryaginArray#slice!
似乎与 Array#slice
没有任何不同。 - B Sevendrop
(删除前n个元素)的最直接相反操作是 take
,它保留前n个元素(还有类似于drop_while
的take_while
)。
Slice 允许您通过指定范围或偏移量和长度返回数组的子集。当传递范围作为参数或传递2个数字时,Array#[]的行为相同。
我希望返回的值是没有被删除元素的数组。我在这里找到了几个解决方案,觉得还不错:
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
解决方案。这将删除最后 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]
您可以以非破坏性的方式实现与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]
Array#delete_at() 是删除数组最后一个元素的最简单方法,如下所示
arr = [1,2,3,4,5,6]
arr.delete_at(-1)
p arr # => [1,2,3,4,5]
如果要删除数组的一个或多个段落,请使用其他答案中的方法。
你也可以添加一些方法
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]
last(n)
。还要注意,在你的方法中不需要使用 length
。 - Marc-André Lafortune