将数组元素分配到块中的有效方法

时间:2014-09-22 19:28:08

标签: ruby arrays

给定一个长度为N的数组,我怎样才能将数组的元素均等地分配到另一个任意长度的数组中?

例如,我在一个数组中有3个项目,我希望它在另一个9个插槽的数组中均匀分布。

[1, 2, 3]

应该导致(接近)

[[], [], [1], [], [], [2], [], [], [3]]

但是,如果我有9个项目要分发到数组长度为2,那么它应该导致

[[1,2,3,4], [5,6,7,8,9]]

谢谢!

注意:结果数组项的位置可能因算法而异,但目的是获得一定程度的均匀分布。在第一个例子中,第0个项可能是[1]。在第二个例子中,第0个项目可能有[1,2,3,4,5]。

2 个答案:

答案 0 :(得分:2)

这是一种简单的方法:

def distribute(arr, slots)
  n = arr.size
  a = Array.new(slots) { [] }
  arr.each_with_index { |e,i| a[i*slots/n] << e }
  a
end

distribute([1,2,3], 9)
  #=> [[1], [], [], [2], [], [], [3], [], []]
distribute([*(1..9)], 2)
  #=> [[1, 2, 3, 4, 5], [6, 7, 8, 9]]

您可以通过修改i*slots/n来更改分配结果。

答案 1 :(得分:1)

所以这里有两个完全不同的用例,一个用于构建长度为n的数组,另一个用于需要分割为长度为n的数组。

这感觉就像是一项家庭作业,但我并没有真正从这两个用例中看到一个模式(除非我遗漏了一些巨大的东西)。

测试用例:

it 'splits on n vals' do
    arr = [1,2,3]
    expect(chunk(arr, 9)).to eq [[], [], [1], [], [], [2], [], [], [3]]
  end

  it 'splits on n vals' do
    arr = [1,2,3,4,5,6,7,8,9]
    expect(chunk(arr,2)).to eq [[1,2,3,4,5],[6,7,8,9]]
  end

代码:

def chunk(arr, num)
  if num < arr.length
    return arr.each_slice( (arr.size/num.to_f).round).to_a
  end
  array = []
  len = arr.length
  (0..num).each do |i|
    if (i % len == 0) && i != 0
      array[i-1] = [arr.first]
      array[i] = []
      arr.shift
    else
      array[i] =  []
    end
  end
  array.pop
  array
end