【问题标题】:How to Scatter Elements of a Ruby Array?如何分散 Ruby 数组的元素?
【发布时间】:2015-06-18 11:04:57
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 您的问题不清楚。您的要求与Array#shuffle 有何不同?
  • Shuffle 返回一个随机混合的数组。我希望元素尽可能分布。
  • @shock_one 不应该 {a: 1} 在结果数组中的第一个和最后一个位置?
  • @EugenePetrov:问得好。但这会使最初的{a:3}s 彼此靠近。正确的方法是从定义必须最大化的“分​​布”度量开始。我知道基于 zip 的解决方案就足够了。

标签: arrays ruby algorithm


【解决方案1】:

所以你的初始方法类似于

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

如果一个组的元素比之前的组少,它会失败。

如果第一个数组太短,我们的想法是切换它们(然后用compact 删除nils):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2019-10-14
    相关资源
    最近更新 更多