如何散布Ruby数组的元素?

时间:2015-06-18 11:04:58

标签: arrays ruby algorithm

我有一个元素数组,它们具有公共属性并按此属性排序。现在,我想达到相反的效果:尽可能地交错具有相同属性值的元素。

[
  {a: 1},
  {a: 1},
  {a: 2},
  {a: 2},
  {a: 2},
  {a: 3},
  {a: 3},
  {a: 3},
  {a: 3},
].scatter_somehow


# =>
[
  {a: 3},
  {a: 1},
  {a: 2},
  {a: 3},
  {a: 2},
  {a: 1},
  {a: 3},
  {a: 2},
  {a: 3},
]

如果a的每个值都有相同数量的元素,我可以将它们分组,然后压缩数组并展平结果。但是,只要最小数组中没有元素,Array#zip就会停止。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

所以你最初的方法就像是

x.group_by { | e | e[:a] }.values.inject(&:zip).flatten

如果组的元素少于早期组,则失败。

想法是在第一个数组太短时切换它们(之后用nil移除compact):

x.group_by { | e | e[:a] }.values.inject do | a, e |
  if a.length < e.length 
    e.zip(a)
  else
    a.zip(e)
  end
end.flatten.compact