如何根据不同订单的多个条件进行排序?

PJ.*_*PJ. 18 ruby sorting

我真的很想在没有猴子修补的情况下处理这个问题,但我还没有找到另一种选择.

我有一个数组(在Ruby中),我需要按多个条件排序.我知道如何使用排序方法,我已经使用了一个选项数组排序的技巧,以排序多个条件.但是,在这种情况下,我需要第一个条件来升序,第二个条件降序排序.例如:

ordered_list = [[1, 2], [1, 1], [2, 1]]
Run Code Online (Sandbox Code Playgroud)

有什么建议?

编辑:刚才意识到我应该提到我不能轻易比较第一个和第二个值(我实际上是在这里处理对象属性).所以对于一个简单的例子,它更像是:

ordered_list = [[1, "b"], [1, "a"], [2, "a"]]
Run Code Online (Sandbox Code Playgroud)

Bri*_*ips 33

怎么样:


ordered_list = [[1, "b"], [1, "a"], [2, "a"]]
ordered_list.sort! do |a,b|
  [a[0],b[1]] <=> [b[0], a[1]]
end

  • 我发现`a [0] <=> b [0]或b [1] <=> a [1]`更具可读性. (4认同)
  • @maasha我认为`或`在这里不起作用,因为`<=>`在相等时返回'0`而'0`不在'false`中.所以`1 <=> 1或1 <=> 2`返回`0`但是`[1,1] <=> [1,2]`返回`-1`. (4认同)

小智 8

我正在做一个噩梦,试图找出如何反转特定属性的排序,但通常对其他两个进行排序.只是关于那些在此之后出现并且被| a,b |混淆的排序的注释 块语法.您不能使用或使用{|a,b| a.blah <=> b.blah}块样式.它必须与或一起使用.此外,如前所述,其他海报交换并跨越比较运算符以反转排序顺序.像这样:sort_by!sort_bysort!sortab<=>

要通过blah和craw正常排序,但按相反的顺序按蓝色排序,请执行以下操作:

something.sort!{|a,b| [a.blah, b.bleu, a.craw] <=> [b.blah, a.bleu, b.craw]}
Run Code Online (Sandbox Code Playgroud)

也可以使用-标志sort_bysort_by!做在数字反向排序(据我所知它仅适用于数字,所以不要用字符串作为它只是错误的尝试,并杀死页).

假设a.craw是一个整数.例如:

something.sort_by!{|a| [a.blah, -a.craw, a.bleu]}
Run Code Online (Sandbox Code Playgroud)