-->

分割的阵列分成相等的部分在红宝石[重复](Splitting an array into equal

2019-06-28 05:22发布

这个问题已经在这里有一个答案:

  • 如何块阵列,红宝石 2个回答

我需要一种方法来在一堆阵列的大小相等的另一个阵列内分割的阵列。 任何人都有这样做的任何方法?

例如

a = [0, 1, 2, 3, 4, 5, 6, 7]
a.method_i_need(3)
a.inspect
    => [[0,1,2], [3,4,5], [6,7]]

Answer 1:

您正在寻找Enumerable#each_slice

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]]


Answer 2:

也许我误读问题,因为对方的回答是已经接受,但它听起来像你想在阵列中3组,每组分割,每个组的大小无关,而不是将其作为分成N个组,每组3以前的答案做。 如果这是你在找什么,铁轨(的ActiveSupport)也有一个方法叫in_groups :

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]]

我不认为这是红宝石等同,但是,您可以通过添加这种简单的方法得到大致相同的结果:

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的定义 ,其传播的额外填补组的请求数量。

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


Answer 3:

尝试

a.in_groups_of(3,false)

它会做你的工作



Answer 4:

作为mltsy写道, in_groups(n, false)应该做的工作。

我只是想补充一个小窍门,以获得正确的平衡my_array.in_group(my_array.size.quo(max_size).ceil, false)

这里是为了说明特技一个例子:

a = (0..8).to_a
a.in_groups(4, false) => [[0, 1, 2], [3, 4], [5, 6], [7, 8]]
a.in_groups(a.size.quo(4).ceil, false) => [[0, 1, 2], [3, 4, 5], [6, 7, 8]]


Answer 5:

这需要一些更好的聪明涂抹掉多余的碎片,但它是一个良好的开端。

def i_need(bits, r)
  c = r.count
  (1..bits - 1).map { |i| r.shift((c + i) * 1.0 / bits ) } + [r]
end

>   i_need(2, [1, 3, 5, 7, 2, 4, 6, 8])
 => [[1, 3, 5, 7], [2, 4, 6, 8]] 
> i_need(3, [1, 3, 5, 7, 2, 4, 6, 8])
 => [[1, 3, 5], [7, 2, 4], [6, 8]] 
> i_need(5, [1, 3, 5, 7, 2, 4, 6, 8])
 => [[1, 3], [5, 7], [2, 4], [6], [8]] 


文章来源: Splitting an array into equal parts in ruby [duplicate]