进行自定义排序的最佳方法是什么?

时间:2021-03-11 08:29:00

标签: arrays ruby-on-rails ruby sorting

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 的方法是什么?

4 个答案:

答案 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) }
相关问题