arr = ["h12020", "h22018", "h22020", "h22019", "h12019"]
expected_arr = ["h22018","h12019","h22019","h12020", "h22020"]
我尝试的方式:
arr.sort { |a, b| a.slice(2, 4) <=> b.slice(2, 4) } # ["h22018","h22019","h12019","h12020", "h22020"]
排序 arr
得到 expected_arr
的方法是什么?
答案 0 :(得分:3)
使用 #sort_by
通常更简洁,如下所示:
arr.sort_by {|a| a.slice(2, 4) + a.slice(1, 1)}
# ["h22018", "h12019", "h22019", "h12020", "h22020"]
此外,您可以操作块内的字符串以按您想要的顺序放置它。在这里,我刚刚对您排序的数字进行了切片并将其添加到末尾。您也可以像 nuaky 那样使用范围。
将 #sort
与块一起使用更灵活,特别是对于降序之类的东西。但它不够简洁,并且在您可以使用 #sort_by
的情况下通常表现不佳。
答案 1 :(得分:3)
与其他答案的语法差异很小,更简洁:
arr.sort_by { |a| a[2..5] + a[1] } # Ruby
arr.sort_by { |a| a.last(4) + a[1] } # Rails
答案 2 :(得分:2)
您可以拆分每个值 [a[2..5], a[1..1]]
=> ["2020", "1"]
,然后按年份和第一个数字排序:
arr.sort_by { |a| [a[2..5], a[1..1]] }
这将按年份 (2020, 2019) 然后按其他参数 (1, 2) 排序,因此您将得到:
["h22018", "h12019", "h22019", "h12020", "h22020"]
答案 3 :(得分:0)
可读性和效率较低,但更酷:
arr.sort_by { _1.chars.rotate(2) }