我想通过评估两个属性来指定一个自定义块方法来对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 ...我将非常感谢你的帮助。
亲切的问候。
答案 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
放在三元运算符中。