使用tiebreaker按长度排序数组

Rya*_*ing 6 ruby arrays sorting

我有一个我想按最长到最短排序ArrayArrays.我很容易实现这一目标sort_by

> a =  [ [1, 2, 9],
         [4, 5, 6, 7],
         [1, 2, 3] ]
> a.sort_by(&:length).reverse # or a.sort_by {|e| e.length}.reverse
=> [[4, 5, 6, 7], [1, 2, 3], [1, 2, 9]]
Run Code Online (Sandbox Code Playgroud)

然而,我想要的是对于相等长度的列表有一种打破平局.如果两个列表的长度相等,应该首先列出最后一个条目的列表.所以在上面的,[1, 2, 9][1, 2, 3]应该进行切换.

我不关心两个列表具有相等长度和相等的最后一个元素的情况,如果发生这种情况,它们可以是任何顺序.我不知道是否/如何使用ruby内置排序来实现这一点.

mu *_*ort 14

你仍然可以这样做sort_by,你只需要意识到Ruby数组比较逐个元素:

ary <=> other_ary→-1,0,+ 1或nil

[...]

比较每个数组中的每个对象(使用<=>运算符).

数组以"元素方式"进行比较; 前两个不相等的元素将决定整个比较的返回值.

这意味着你可以使用数组作为sort_by键,然后输入一些整数否定来反转排序顺序,你得到:

a.sort_by { |e| [-e.length, -e.last] }
Run Code Online (Sandbox Code Playgroud)

这将为您[[4, 5, 6, 7], [1, 2, 9], [1, 2, 3]]提供您正在寻找的东西.

如果你没有使用数字,那么"否定反转命令"技巧将不起作用,那么使用Shaunak的sort方法.