将Ruby数组分成X组

4

我需要将一个数组分成X个较小的数组。我不关心较小数组中元素的数量,只需要从大数组创建X个数组即可。我已经阅读了一些内容,似乎我需要类似于rails中in_groups方法的方法。但是我现在没有使用rails,只有ruby。


1
你可以这样做:def doit(a, x) a.each_slice((a.size.to_f/x).ceil.to_i).to_a end。 假设 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],那么 doit(a,3) #=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]doit(a,4) #=> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]doit(a,5) #=> [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]] - Cary Swoveland
5个回答

7

为了获取那个函数而要求使用Rails是过度的。只需使用each_slice

team = ['alice', 'andy', 'bob', 'barry', 'chloe', 'charlie']
=> ["alice", "andy", "bob", "barry", "chloe", "charlie"]

team.each_slice(2).to_a
=> [["alice", "andy"], ["bob", "barry"], ["chloe", "charlie"]]

each_slice方法的参数是每个切片中元素的数量(除了可能是最后一个切片)。如果你正在寻找X个切片,可以像这样操作:

team.each_slice(team.length/X).to_a

这并不完美,因为如果数组长度不是X的倍数,你将得到一片额外的切片,但它可以让你在某种程度上达到目标,并且你可以根据你的需要进行微调。由于你说你不关心每个切片有多少个元素,你可以使用上面提到的length/x方法,然后检查是否有一个过多的切片。如果是这样,只需将最后两个切片合并成一个超大的切片即可。这可能避免了一些烦琐的几何计算或浮点运算。

2

我决定放置:

require 'active_support/core_ext/array/grouping'

2
只需要 require 'active_support/core_ext/array/grouping' 就足够了。不需要 require 所有核心扩展,当然也不需要整个庞大的 Rails。 - Jörg W Mittag
1
这是您选择的答案吗?如果不是,那么没有必要也不希望您创建一个答案来告诉我们。 - the Tin Man

2

您可以制定自己的方法,以下是基本思路:

class Array
  def my_group(x)
    start = 0
    size = (self.size() / Float(x)).ceil
    while x > 0
      yield self[start, size]
      size = ((self.size() - 1 - start) / Float(x)).ceil
      start += size
      x -= 1
    end
  end
end

%w(1 2 3 4 5 6 7 8 9 10).my_group(3) {|group| p group}
# =>["1", "2", "3", "4"]
# =>["4", "5", "6"]
# =>["7", "8", "9"]

2
如果x是一组的计数:
x = 2
a = [1,2,3,4,5,6,7,8,9,10,11,12]
a.in_groups(x)

=> [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]

如果按x个元素分组:

x = 2
a = [1,2,3,4,5,6,7,8,9,10,11,12]
a.each_slice(x).to_a

=> [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]

=> [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]]


0
如果你需要有N个组,你可以使用ActiveSupport提供的in_groups monkey-patch,如另一个答案中所提到的:
require 'active_support/core_ext/array/grouping'
my_array = [1,2,3,4,5]
my_array.in_groups(2)
# => [[1, 2, 3], [4, 5, nil]]
my_array.in_groups(2, false)
# => [[1, 2, 3], [4, 5]]

如果你关心的是组中元素的数量而不是组的数量,你可以使用 Ruby 核心提供的 each_slice

my_array = [1,2,3,4,5]
my_array.each_slice(2).to_a
# => [[1, 2], [3, 4], [5]]

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