Ruby将数组拆分为X组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby将数组拆分为X组相关的知识,希望对你有一定的参考价值。

我需要将一个数组拆分成X个较小的数组。我不关心较小数组中的元素数量,我只需要从较大的数组中创建X数组。我一直在做一些阅读,似乎我需要一个类似于rails的in_groups方法的方法。我现在不使用rails,只是ruby。

答案

你可以制作自己的方法,这是一个基本的想法:

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"]
另一答案

要求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方法,然后检查你是否有一个太多的切片。如果是这样,只需将最后两个切片连接到一个巨型切片中。这可能会避免一些繁琐的数学运算或浮点运算。

另一答案

我决定把:

require 'active_support/core_ext/array/grouping'
另一答案

如果您需要N组,可以使用ActiveSupport提供的the 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]]

以上是关于Ruby将数组拆分为X组的主要内容,如果未能解决你的问题,请参考以下文章

React typescript - 将数组拆分为字母组

将一个 JS 数组拆分为 N 个数组

将一个数组拆分为 2 个数组 C#

将数组拆分为按对象属性分组的 2 个数组 [重复]

如何在 Ruby 中拆分分隔字符串并将其转换为数组?

你如何在 Ruby 中阅读这个三元条件?