8

Array#drop删除数组的前n 个元素。删除数组的最后m个元素的好方法是什么?或者,保留数组中间元素(大于n,小于m)的好方法是什么?

4

8 回答 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 回答