【发布时间】:2019-02-12 06:25:48
【问题描述】:
我正在尝试根据 3 个不同的标准对数组进行排序。假设我有一个这样的哈希数组:
a = [
{ "name" => "X", "year" => "2013-08"},
{ "name" => "A", "year" => "2017-01"},
{ "name" => "X", "year" => "2000-08"},
{ "name" => "B", "year" => "2018-05"},
{ "name" => "D", "year" => "2016-04"},
{ "name" => "C", "year" => "2016-04"}
]
我想先按“年份”降序排序所有元素,然后按“名称”升序排序,然后将所有匹配给定名称的元素移动到数组的开头,同时仍然尊重“年份”命令。对于此示例,假设我正在寻找“名称”值为“X”的元素。所以我正在寻找的输出是:
{"name"=>"X", "year"=>"2013-08"}
{"name"=>"X", "year"=>"2000-08"}
{"name"=>"B", "year"=>"2018-05"}
{"name"=>"A", "year"=>"2017-01"}
{"name"=>"C", "year"=>"2016-04"}
{"name"=>"D", "year"=>"2016-04"}
所以一切都是按“年份”的降序排列,然后是“名称”的升序,然后是“名称”==“X”的所有哈希移到顶部,仍然按“年份”排序。
我通过这样做来处理升序/降序排序:
a.sort { |a,b| [b["year"], a["name"]] <=> [a["year"], b["name"]] }
但这仅处理我需要的前两个标准。后来我尝试了这样的事情:
top = []
a.each { |x| top << x if x["name"] == "X" }
a.delete_if { |x| x["name"] == "X"}
a.unshift(top)
它确实产生了所需的输出,但显然很笨重,似乎不是最好的做事方式。有没有更快、更有效的方法来做我想做的事情?
(仅供参考,年份值是字符串,我无法将它们转换为整数。我在这里简化了值,但我从中提取的数据实际上在每个值的末尾附加了一系列其他字符和符号.)
【问题讨论】: