我有一个二维数组,其结构如下
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}
但它没有帮助。我是红宝石和铁轨的新手。谁能帮助我解决我的问题。
答案 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的答案。