arrays - 如何分散 Ruby 数组的元素?

标签 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 在最小数组中没有元素时立即停止。

我该怎么做?

最佳答案

所以你最初的方法是这样的

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

如果一个组的元素少于之前的组,则失败。

想法是如果第一个数组太短就切换它们(之后用 compact 删除 nil):

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

关于arrays - 如何分散 Ruby 数组的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30913630/

相关文章:

java - Java 中的二维数组未正确更改

javascript - 试图理解这个函数 : Array. prototype.reverse = function() {

c++ - 通过指针使用 C++ 恢复 char 数组的问题

ruby-on-rails - Rails 回形针::AdapterRegistry::NoHandlerError

Ruby 需要关键字参数

c# - Asp.net 成员(member)资格使用什么哈希算法?

algorithm - N个矩形交集

javascript - 在不应用的情况下将一个数组插入(拼接?)到另一个数组中

javascript - 如何将静态 Assets 打包到 gem 中以便在 Sinatra 应用程序中使用?

algorithm - 离散单元的 3D 椭球体