在Ruby中需要将数组分割成指定大小的子数组

41

我有一个数组,它长这样:

arr = [4, 5, 6, 7, 8, 4, 45, 11]

我想要一个像这样的高级方法:

sub_arrays = split (arr, 3)

这应该返回以下内容:[[4, 5, 6], [7,8,4], [45,11]]

注意:此问题与“如何分块数组”不是重复的。分块问题是关于批处理,而这个问题是关于拆分数组。


1
这个问题不是“如何分块数组”的重复。分块问题是关于批处理的,而这个问题是关于拆分数组的。 - Qwertie
4个回答

59
arr.each_slice(3).to_a
each_slice返回一个Enumerable,如果这已经足够了,你不需要调用to_a。在1.8.6中,你需要执行以下操作:
require 'enumerator'
arr.enum_for(:each_slice, 3).to_a

如果你只需要进行迭代,你可以简单地执行:

arr.each_slice(3) do |x,y,z|
  puts(x+y+z)
end

4
对于旧版的 Ruby,可以使用以下代码:b=[]; b << a.shift(3) until a.empty?。它的作用是将数组 a 中的元素每三个一组地移动到数组 b 中,直到数组 a 为空。 - Nakilon
@Nakilon:这会破坏原始数组。 - sepp2k
1
哎呀,是的,需要更多的代码。c,b=a.dup,[]; b << c.shift(3) until c.empty?。如果a不是一维数组等,则可能会出现dup问题。 - Nakilon

6
在Rails中,您可以使用方法in_groups_of,它将将数组分成指定大小的组
arr.in_groups_of(3) # => [[4, 5, 6], [7, 8, 4], [45, 11, nil]]
arr.in_groups_of(3, false) # => [[4, 5, 6], [7, 8, 4], [45, 11]]

而方法in_groups将一个数组分成指定数量的平衡组。

arr.in_groups(5) # => [[4, 5], [6, 7], [8, 4], [45, nil], [11, nil]]
arr.in_groups(5, false) # => [[4, 5], [6, 7], [8, 4], [45], [11]]

4

您也可以针对特定目的使用此功能:

((1..10).group_by {|i| i%3}).values    #=> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]

如果您只想要两个分区数组:

(1..6).partition {|v| v.even? }  #=> [[2, 4, 6], [1, 3, 5]]

1
array.group_by 非常有用。您可以执行以下操作: false_group, true_group = some_array.group_by{|i| i.test_something?()}.values - Automatico

3

1
这是错误的。它并没有像作者说的那样将一个数组分割成指定大小的子数组。它创建了3个组,但不是3个数组。 - Nick Roz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接