我真的很想不用修补程序来处理这个问题,但是我还没有找到另一个选择。
我有一个数组(在Ruby中),我需要按多个条件排序。我知道如何使用排序方法,并且我已经使用了排序的技巧,使用一组选项来按多个条件排序。但是,在本例中,我需要第一个条件进行升序排序,第二个条件进行降序排序。例如:
ordered_list = [[1, 2], [1, 1], [2, 1]]
有什么建议吗?
编辑:我刚刚意识到我不能很容易地比较第一个和第二个值(我实际上是在处理对象属性)。因此,对于一个简单的示例,它更像这样:
ordered_list = [[1, "b"], [1, "a"], [2, "a"]]
发布于 2012-07-04 07:59:11
我做了一个噩梦,试图弄清楚如何对一个特定属性进行反向排序,但正常情况下对其他两个属性进行排序。只需注意一下在此之后出现并被|a,b|块语法混淆的那些数据集的排序。不能将{|a,b| a.blah <=> b.blah}
块样式与sort_by!
或sort_by
一起使用。它必须与sort!
或sort
一起使用。此外,正如前面其他发帖者所指出的那样,在比较运算符<=>
之间交换a
和b
以颠倒排序顺序。如下所示:
通常按废话和爬虫排序,但按bleu的逆序排序执行以下操作:
something.sort!{|a,b| [a.blah, b.bleu, a.craw] <=> [b.blah, a.bleu, b.craw]}
还可以将-
符号与sort_by
或sort_by!
一起使用来对数字进行反向排序(据我所知,它只对数字有效,所以不要尝试对字符串进行反向排序,因为它只会出错并杀死页面)。
假设a.craw
是一个整数。例如:
something.sort_by!{|a| [a.blah, -a.craw, a.bleu]}
发布于 2008-09-16 15:21:56
我有同样的基本问题,并通过添加以下内容解决了它:
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
这是一个简单地反转<=>函数的包装器,然后允许您执行以下操作:
your_objects.sort_by {|y| [y.prop1,Inverter.new(y.prop2)]}
发布于 2010-07-18 18:31:52
我已经使用Glenn的食谱很长一段时间了。厌倦了一遍又一遍地从一个项目复制代码到另一个项目,我决定让它成为一个宝石:
https://stackoverflow.com/questions/73032
复制相似问题