如何使用垫片传播列表?

时间:2015-11-07 16:19:14

标签: ruby

我希望根据我希望新列表的大小,将列表(例如[1,2,3,4])均匀地分散到不同的列表中,例如[1, nil, nil, 2, nil, nil, 3, nil, 4, nil]

所以 [1, 2, 3, 4]到大小为9的列表将是:[1, nil, nil, 2, nil, 3, nil, 4, nil]

[1,2,3,4]到大小为4的列表将是:[1,2,3,4]

我需要传播"不均匀"垫片,应该从左到右 - 看看我的第一个例子。

我在下面回答了我自己的问题。

2 个答案:

答案 0 :(得分:0)

我决定为此制作一个宝石:gem install CreamCheese

安装并要求宝石(require 'CreamCheese')后,你可以用刀子展开一个清单。

require 'CreamCheese'
CreamCheese::Knife.spread [1,2,3,4], 9 #=> [1, nil, nil, 2, nil, 3, nil, 4, nil]
CreamCheese::Knife.spread [1,2,3,4], 4 #=> [1,2,3,4]

答案 1 :(得分:0)

我不会为这个使用宝石,因为它可以用几行Ruby来解决。不幸的是,您没有准确指定您希望如何处理差价不均匀的情况("偶数"当每个项目后面跟着相同数量的垫片时)。

在均匀传播的简单情况下:

# The general case
spread_array = array.flat_map {|el| [el] + [spacer] * (spread / array.size - 1)

# An example
[1, 3].flat_map {|el| [el] + [nil] * 2 } #=> [1, nil, nil, 3, nil, nil]

如果您希望在最左边的元素后面添加剩余间距,可以使用:

# Extra spread goes on the leftmost items
spread_array = array.flat_map.with_index do |el, i|
  [el] + [spacer] * (spread / array.size - (i < spread % array.size ? 0 : 1))
end