是否有返回两个子数组的Ruby Array方法:一个是指定大小的,另一个是剩余的内容?

时间:2016-07-16 13:25:18

标签: arrays ruby

我需要渲染数组的前5个元素的内容,并在网页上显示“和X更多”。在Array(或Enumerable)上是否有一个内置方法可以轻松地将一个数组分成两个子数组:第一个由最多固定大小组成,第二个由数组余数组成?

我正在寻找一个简单的方法调用来为我做这个。我查看的大多数方法(如Enumerable#partition)使用逻辑条件来划分数组,并且不为块提供索引。

我刚写了下面的代码来做我想要的。请救我脱离自己,并指导我一个已经做到的方法。

class Array
  def bifurcate(size=length)
    if size < 0
      raise ArgumentError, "attempt to bifurcate using negative size"
    end

    remainder_size = length - size
    if remainder_size < 0
      remainder_size = 0
    end

    [
      first(size),
      last(remainder_size)
    ]
  end
end


('a'..'g').to_a.bifurcate(2)
# => [["a", "b"], ["c", "d", "e", "f", "g"]]
('a'..'g').to_a.bifurcate(20)
# => [["a", "b", "c", "d", "e", "f", "g"], []]
('a'..'g').to_a.bifurcate()
# => [["a", "b", "c", "d", "e", "f", "g"], []]
('a'..'g').to_a.bifurcate(0)
# [[], ["a", "b", "c", "d", "e", "f", "g"]]
('a'..'g').to_a.bifurcate(-1)
# ArgumentError: attempt to bifurcate using negative size

另外,让我限定我想要一个简单的方法调用来做我想要的。还要考虑起始数组可能包含重复值,此方法需要尊重原始数组并返回重复项。

3 个答案:

答案 0 :(得分:4)

您可以使用Enumerable#partitionEnumerator#with_index方法,如下所示:

size = 2
(1..6).partition.with_index { |_,i| i < size }
#=> [[1, 2], [3, 4, 5, 6]]

或者,如果你的输入数组可以变异,那么,下面也会做一些技巧

[array.shift(size), array]

答案 1 :(得分:2)

[array.take(3), array.drop(3)]
# [["a", "b", "c"], ["d", "e", "f", "g"]]

希望有所帮助:)

答案 2 :(得分:1)

使用Array#[]

[arr[0,size_of_first], arr[size_of_first..-1] || []]