首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何按不同顺序的多个条件排序?

如何按不同顺序的多个条件排序?
EN

Stack Overflow用户
提问于 2008-09-16 14:38:03
回答 3查看 10.7K关注 0票数 18

我真的很想不用修补程序来处理这个问题,但是我还没有找到另一个选择。

我有一个数组(在Ruby中),我需要按多个条件排序。我知道如何使用排序方法,并且我已经使用了排序的技巧,使用一组选项来按多个条件排序。但是,在本例中,我需要第一个条件进行升序排序,第二个条件进行降序排序。例如:

代码语言:javascript
复制
ordered_list = [[1, 2], [1, 1], [2, 1]]

有什么建议吗?

编辑:我刚刚意识到我不能很容易地比较第一个和第二个值(我实际上是在处理对象属性)。因此,对于一个简单的示例,它更像这样:

代码语言:javascript
复制
ordered_list = [[1, "b"], [1, "a"], [2, "a"]]
EN

回答 3

Stack Overflow用户

发布于 2012-07-04 07:59:11

我做了一个噩梦,试图弄清楚如何对一个特定属性进行反向排序,但正常情况下对其他两个属性进行排序。只需注意一下在此之后出现并被|a,b|块语法混淆的那些数据集的排序。不能将{|a,b| a.blah <=> b.blah}块样式与sort_by!sort_by一起使用。它必须与sort!sort一起使用。此外,正如前面其他发帖者所指出的那样,在比较运算符<=>之间交换ab以颠倒排序顺序。如下所示:

通常按废话和爬虫排序,但按bleu的逆序排序执行以下操作:

代码语言:javascript
复制
something.sort!{|a,b| [a.blah, b.bleu, a.craw] <=> [b.blah, a.bleu, b.craw]}

还可以将-符号与sort_bysort_by!一起使用来对数字进行反向排序(据我所知,它只对数字有效,所以不要尝试对字符串进行反向排序,因为它只会出错并杀死页面)。

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

代码语言:javascript
复制
something.sort_by!{|a| [a.blah, -a.craw, a.bleu]}
票数 8
EN

Stack Overflow用户

发布于 2008-09-16 15:21:56

我有同样的基本问题,并通过添加以下内容解决了它:

代码语言:javascript
复制
class Inverter
  attr_reader :o

  def initialize(o)
    @o = o
  end

  def <=>(other)
    if @o.is && other.o.is
      -(@o <=> other.o)
    else
      @o <=> other.o
    end
  end
end

这是一个简单地反转<=>函数的包装器,然后允许您执行以下操作:

代码语言:javascript
复制
your_objects.sort_by {|y| [y.prop1,Inverter.new(y.prop2)]}
票数 4
EN

Stack Overflow用户

发布于 2010-07-18 18:31:52

我已经使用Glenn的食谱很长一段时间了。厌倦了一遍又一遍地从一个项目复制代码到另一个项目,我决定让它成为一个宝石:

http://github.com/dadooda/invert

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档