是否有更好的(和等效的)方法对这样的项目进行排序?
items.sort! do |p1, p2|
if (p1.foo == p2.foo)
if (p1.bar == p2.bar)
if (p1.moo == p2.moo)
p1.wow <=> p2.wow # Ascending order
else
p2.sam.moo <=> p1.sam.moo # Descending order, 2 levels attribute
end
else
p2.bar <=> p1.bar # Descending order
end
else
p1.foo <=> p2.foo # Ascending order
end
end
答案 0 :(得分:3)
您可以转换数组中的对象进行比较
[p1.foo, p1.bar, p1.moo, p1.sam.moo] <=> [p2.foo, p2.bar, p2.moo, p2.sam.moo]
阵列的比较就像字符串:第一个不同的元素。
如果某些比较中的反转索引(p2.bar <=> p1.bar
)不是拼写错误,您还需要切换数组元素。
或者您可以覆盖班级中的比较运算符
def <=>(p2)
...
end
在这种情况下,您无需传递items.sort!
中的任何内容。