首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将拼音数组的元素划分为确切数量的(几乎)大小相等的子数组

将拼音数组的元素划分为确切数量的(几乎)大小相等的子数组
EN

Stack Overflow用户
提问于 2012-09-12 01:09:14
回答 5查看 60.8K关注 0票数 67

我需要一种方法将一个数组拆分为大小大致相等的多个较小的数组。有谁有办法做到这一点吗?

例如

代码语言:javascript
复制
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
groups = a.method_i_need(3)
groups.inspect
    => [[1,2,3,4,5], [6,7,8,9], [10,11,12,13]]

请注意,这是一个与dividing an array into chunks完全不同的问题,因为a.each_slice(3).to_a将生成5个组(而不是我们希望的3个组),并且最后一个组的大小可能与其他组完全不同:

[1,2,3,4,5,6,7,8,9,10,11,12,13] #这不是我们想要的。

在这个问题中,预先指定了期望的块数量,并且每个块的大小最多相差1。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-12 01:12:03

你在找Enumerable#each_slice

代码语言:javascript
复制
a = [0, 1, 2, 3, 4, 5, 6, 7]
a.each_slice(3) # => #<Enumerator: [0, 1, 2, 3, 4, 5, 6, 7]:each_slice(3)>
a.each_slice(3).to_a # => [[0, 1, 2], [3, 4, 5], [6, 7]]
票数 130
EN

Stack Overflow用户

发布于 2012-11-30 04:47:48

也许我误解了这个问题,因为另一个答案已经被接受了,但听起来你想把数组分成3个相等的组,而不是像前面的答案那样把它分成N个组,每组3个。如果这就是您要找的,Rails (ActiveSupport)也有一个名为in_groups的方法

代码语言:javascript
复制
a = [0,1,2,3,4,5,6]
a.in_groups(2) # => [[0,1,2,3],[4,5,6,nil]]
a.in_groups(3, false) # => [[0,1,2],[3,4], [5,6]]

我不认为有ruby的等价物,但是,你可以通过添加这个简单的方法得到大致相同的结果:

代码语言:javascript
复制
class Array; def in_groups(num_groups)
  return [] if num_groups == 0
  slice_size = (self.size/Float(num_groups)).ceil
  groups = self.each_slice(slice_size).to_a
end; end

a.in_groups(3) # => [[0,1,2], [3,4,5], [6]]

唯一的区别(正如您所看到的)是,这不会将“空空间”分散到所有组中;除了最后一个组之外,每个组的大小都是相等的,并且最后一个组总是持有剩余的空间加上所有的“空空间”。

更新:正如@rimsky敏锐地指出的那样,上面的方法并不总是导致正确的组数量(有时它会在结束时创建多个“空组”,并将它们省略)。这是一个更新的版本,是从ActiveSupport's definition中缩减出来的,它将多余的部分分散出来,以填充所需数量的组。

代码语言:javascript
复制
def in_groups(number)
  group_size = size / number
  leftovers = size % number

  groups = []
  start = 0
  number.times do |index|
    length = group_size + (leftovers > 0 && leftovers > index ? 1 : 0)
    groups << slice(start, length)
    start += length
  end

  groups
end
票数 118
EN

Stack Overflow用户

发布于 2012-09-12 01:12:56

试一试

代码语言:javascript
复制
a.in_groups_of(3,false)

它会做好你的工作

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12374645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档