使用自定义排序首选项排序数组

Lew*_*uce 5 ruby

有人能告诉我如何根据自定义字符串对嵌套数组进行排序吗?例如,有没有办法排序:

[['Red','Blue'],['Green','Orange'],['Purple','Yellow']]
Run Code Online (Sandbox Code Playgroud)

by "Orange","Yellow"然后"Blue"呢?最终结果如下:

[['Green','Orange'],['Purple','Yellow'],['Red','Blue']]
Run Code Online (Sandbox Code Playgroud)

它不按字母顺序排序.我很想知道我是否可以定义值来排序以实现上述目标.

Pat*_*ide 8

sort_by 对于那种排序总是非常方便:

a = [['Red','Blue'],['Green','Orange'],['Purple','Yellow']]
order_array = ['Orange', 'Yellow', 'Blue']

p a.sort_by { |arr| order_array.index(arr[1]) }

# => [["Green", "Orange"], ["Purple", "Yellow"], ["Red", "Blue"]]
Run Code Online (Sandbox Code Playgroud)


the*_*Man 3

group_by这是和的任务values_at

ORDER = %w[Orange Yellow Blue]
ary = [['Red','Blue'],['Green','Orange'],['Purple','Yellow']]

ary.group_by{ |a| a.last }.values_at(*ORDER)
# => [[["Green", "Orange"]], [["Purple", "Yellow"]], [["Red", "Blue"]]]
Run Code Online (Sandbox Code Playgroud)

以下是group_by聚会带来的内容:

ary.group_by{ |a| a.last }
# => {"Blue"=>[["Red", "Blue"]],
#     "Orange"=>[["Green", "Orange"]],
#     "Yellow"=>[["Purple", "Yellow"]]}
Run Code Online (Sandbox Code Playgroud)

一旦获得了用于对每个数组进行分组的值的哈希值,就values_at可以轻松地以正确的顺序提取它们。

这是一种非常快速且有效的完成任务的方法,因为它几乎不会随着增长而减慢,ary因为没有进行真正的排序,它只是按值分组,然后以给定的顺序从哈希中提取。

如果您想要与示例中完全相同的数组数组,则flatten结果一次:

ary.group_by{ |a| a.last }.values_at(*ORDER).flatten(1)
# => [["Green", "Orange"], ["Purple", "Yellow"], ["Red", "Blue"]]
Run Code Online (Sandbox Code Playgroud)

如果有多个“橙色”、“黄色”或“蓝色”元素,您就不会想要这样做,因为结果不会非常有用。