如何在Ruby中删除数组的结尾

时间:2012-11-23 16:58:43

标签: ruby arrays iterator

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

8 个答案:

答案 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]