我希望根据我希望新列表的大小,将列表(例如[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]
我需要传播"不均匀"垫片,应该从左到右 - 看看我的第一个例子。
我在下面回答了我自己的问题。
答案 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