ruby中的自定义排序方法

时间:2013-03-14 04:11:09

标签: ruby-on-rails ruby

我想通过评估两个属性来指定一个自定义块方法来对ruby中的对象数组进行排序。然而,在谷歌进行了多次搜索之后,如果没有< =>,我就没有任何例子。操作

这就是我想要做的: 比较a vs b:

if a.x less than b.x return -1
if a.x greater than b.x return 1
if a.x equals b.x, then compare by another property , like a.y vs b.y

这是我的代码(ruby中的noob,对不起),它不起作用......

ar.sort! do |a,b|
   if a.x < b.y return -1
   elseif a.x > b.x return 1
   else return a.y <=> b.y
end

这个块在一个函数内,所以返回正在退出函数并返回-1 ...我将非常感谢你的帮助。

亲切的问候。

3 个答案:

答案 0 :(得分:28)

这将为您提供x的升序,然后是y:

points.sort_by{ |p| [p.x, p.y] }

答案 1 :(得分:15)

使用案例陈述:

ar.sort do |a, b|
  case
  when a.x < b.x
    -1
  when a.x > b.x
    1
  else
    a.y <=> b.y
  end
end 

三元:

ar.sort { |a,b| a.x < b.x ? -1 : (a.x > b.x ? 1 : (a.y <=> b.y)) }

答案 2 :(得分:0)

这似乎有效:

# Ascending
ar.sort! do |a,b|
  (a-b).abs() > 0 ? a-b : 0
end

# Descending
ar.sort! do |a,b|
  (a-b).abs() > 0 ? b-a : 0
end

没有必要使用太空船操作员(<=>) - 它在Ruby中似乎是多余的(在语法效率方面),因为Ruby认为0是真的,并且特别针对这种用法(上图),您可以将显式0放在三元运算符中。