如何通过三个或更多元素(ruby)对数组进行排序

Rad*_*dek 4 ruby arrays sorting

我有14列的csv文件,我想在红宝石中按第6列排序,然后排在第2列,然后排在第11列.

有很好的方法.sort_by但它只适用于两列,不是吗.并array_of_arrays.sort_by {|e| [e[2], e[0],e[1]],}不起作用.

所以让我们说在下面的示例中我希望它按第3列,第1列,第2列排序

array_of_arrays = [[1,9,'a'],[2,2,'a'], [2,6,'b'], [1,3,'a'], [2,1,'b']]

array_of_arrays.each {|line| puts line.inspect }
puts
array_of_arrays.sort_by {|e| [e[2], e[0]]} .each {|line| puts line.inspect }
Run Code Online (Sandbox Code Playgroud)

但结果并不理想

[1, 9, "a"]
[2, 2, "a"]
[2, 6, "b"]
[1, 3, "a"]
[2, 1, "b"]

[1, 9, "a"]
[1, 3, "a"]
[2, 2, "a"]
[2, 6, "b"]
[2, 1, "b"]
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 9

这个:

array_of_arrays = [[1,9,'a'],[2,2,'a'], [2,6,'b'], [1,3,'a'], [2,1,'b']]

array_of_arrays.each {|line| p line }
puts
array_of_arrays.sort_by {|e| [e[2], e[0], e[1]]} .each {|line| p line }
Run Code Online (Sandbox Code Playgroud)

为我生成以下输出:

[1, 3, "a"]
[1, 9, "a"]
[2, 2, "a"]
[2, 1, "b"]
[2, 6, "b"]
Run Code Online (Sandbox Code Playgroud)

这就是你想要的,对吧?

  • 为了让DRY达到疯狂的极限,我会考虑:sort_by {| a | [2,0,1].收集{| i | a [i]}} (4认同)