基于第一个元素的Ruby二维数组排序

时间:2013-12-10 08:54:45

标签: ruby-on-rails ruby sorting

我有一个二维数组,其结构如下

a = [["5/2013", 20.0, 6.0, 6.0], 
["7/2013", 73.0, 66.0, 66.0], 
["50/2013", 11530.0, 12625.27, 12087.75], 
["2/2014", 5926.0, 6058.0, 5876.4], 
["3/2013", 15.0, 0.0, 0.0], 
["4/2013", 15.0, 0.0, 0.0]]

我想根据第一个元素对数组进行排序,每个数组的第一个元素表示一年中没有的一周(即“2014年2月”表示2014年的第二周,大于“50/2013”​​) 结果就像这样

["3/2013", 15.0, 0.0, 0.0], 
["4/2013", 15.0, 0.0, 0.0],
["5/2013", 20.0, 6.0, 6.0], 
["7/2013", 73.0, 66.0, 66.0], 
["50/2013", 11530.0, 12625.27, 12087.75], 
["2/2014", 5926.0, 6058.0, 5876.4], 
]

我试过这个

a.sort{|a,b| a[0].split('/')[1].to_i <=> b[0].split('/')[1].to_i  && a[0].split('/')  [0].to_i <=> b[0].split('/')[0].to_i}

但它没有帮助。我是红宝石和铁轨的新手。谁能帮助我解决我的问题。

2 个答案:

答案 0 :(得分:7)

a.sort_by {|i| i.first.split('/').map(&:to_i).reverse }

#[
#  ["3/2013", 15.0, 0.0, 0.0],
#  ["4/2013", 15.0, 0.0, 0.0],
#  ["5/2013", 20.0, 6.0, 6.0],
#  ["7/2013", 73.0, 66.0, 66.0],
#  ["50/2013", 11530.0, 12625.27, 12087.75],
#  ["2/2014", 5926.0, 6058.0, 5876.4]
#]

答案 1 :(得分:2)

假设您有一个正确形成的第一个元素,意味着Date.parse不会引发任何异常,请使用以下

>> array = [["5/2013", 20.0, 6.0, 6.0], ["7/2013", 73.0, 66.0, 66.0], ["50/2013", 11530.0, 12625.27, 12087.75], ["2/2014", 5926.0, 6058.0, 5876.4], ["3/2013", 15.0, 0.0, 0.0], ["4/2013", 15.0, 0.0, 0.0]]
>> array.sort_by { |date, _| Date.parse(date) }

要处理50/2013之类错误形成的日期(在您的问题中),您需要确定默认值。假设您要将默认值设置为今天的日期,请将第二行更改为

>> array.sort_by { |date, _| Date.parse(date) rescue Date.today}

修改

我认为第一个元素就像一个日期。第二次看你的问题让我相信它不是一个约会。如果这不是约会,我将不得不同意sawa的评论。如果你真的想对它进行排序,请使用以下

array.sort do |a,b|
  num1, year1 = a[0].split('/')
  num2, year2 = b[0].split('/')

  if year1 == year2
    num1.to_i <=> num2.to_i
  else
    year1.to_i <=> year2.to_i
  end
end

编辑忽略上面的大方法,使用Santosh的答案。