【问题标题】:Order an array in an alternating pattern以交替模式对数组进行排序
【发布时间】:2019-09-10 08:24:17
【问题描述】:

我有一个哈希数组:

[ 
  {item0: 1.0, item1: 0.0},
  {item0: 0.0, item1: 1.0},
  {item0: 0.0, item1: 1.0},
  {item0: 0.0, item1: 0.0}
]

我希望能够对数组进行排序,以便item1 在 1.0 和 0.0 之间交替。会有相同数量的 1 和 0。

这怎么可能?

array.sort_by{|x| x[item1]} 没有得到想要的输出。

想要的输出是:

[ 
  {item0: 1.0, item1: 0.0},
  {item0: 0.0, item1: 1.0},
  {item0: 0.0, item1: 0.0},
  {item0: 0.0, item1: 1.0}
]

【问题讨论】:

  • 这不是那个问题的重复。我不希望它们按排序顺序。我希望他们交替进行。
  • @Iceman 是的,会有相同数量的 1.0s 和 0.0s

标签: ruby-on-rails arrays ruby sorting


【解决方案1】:

我相信这会给你想要的。

data = [{item0: 1.0, item1: 0.0},
        {item0: 0.0, item1: 1.0},
        {item0: 0.0, item1: 1.0},
        {item0: 0.0, item1: 0.0}]

zeros, ones = data.partition{ |i| i[:item1] == 0 }

# This does the same
# ones   = data.select { |x| x[:item1] == 1 }
# zeros = data.select { |x| x[:item1] == 0 }

ones.zip(zeros).flatten.compact

great answer 得到这个想法

【讨论】:

    【解决方案2】:
     evens, odds = my_array.partition{|i| i[:item1] == 0 }
     alternating = []
     max = [evens.size, odds.size].max
     t = 0
     while t < max + 1
        alternating << evens[t] unless evens[t].nil?
        alternating << odds[t] unless odds[t].nil?
        t += 1
     end
    
    alternating
    

    如果大小差异很大,则上述应将所有剩余值分组在最后。如果这不是您想要的,请将 max 更改为 min。

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多