Array#drop删除数组的前n 个元素。删除数组的最后m个元素的好方法是什么?或者,保留数组中间元素(大于n,小于m)的好方法是什么?
问问题
15575 次
8 回答
28
这正是Array#pop
为了:
x = [1,2,3]
x.pop(2) # => [2,3]
x # => [1]
于 2012-11-23T17:16:31.110 回答
9
您还可以使用 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
于 2012-11-23T17:08:57.360 回答
2
drop
与(删除前 n 个元素)最直接相反的是take
,它保留前 n 个元素(还有take_while
类似于drop_while
)。
Slice 允许您通过指定范围或偏移量和长度来返回数组的子集。当传递一个范围作为参数或传递 2 个数字时,Array#[] 的行为相同
于 2012-11-23T17:11:11.430 回答
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]
于 2012-11-23T17:06:05.410 回答
1
我希望返回值是没有删除元素的数组。我在这里找到了几个解决方案没问题:
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
那个时候的解决方案。
于 2018-10-11T05:52:27.160 回答
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]
于 2017-08-25T13:52:43.810 回答
0
Array#delete_at() 是删除数组最后一个元素的最简单方法,如下所示
arr = [1,2,3,4,5,6]
arr.delete_at(-1) # => [1,2,3,4,5]
要删除数组的一个或多个段,请使用其他答案中的方法。
于 2021-03-14T08:06:01.317 回答
-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]
于 2012-11-23T17:12:27.757 回答