Sco*_*ott 201
我推荐使用sort_by:
objects.sort_by {|obj| obj.attribute}
Run Code Online (Sandbox Code Playgroud)
特别是如果可以计算属性.
或者更简洁的方法:
objects.sort_by(&:attribute)
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 34
是的,使用Array#sort!
它很容易.
myarray.sort! { |a, b| a.attribute <=> b.attribute }
Run Code Online (Sandbox Code Playgroud)
shi*_*mar 26
升序:
objects_array.sort! { |a, b| a.attribute <=> b.attribute }
Run Code Online (Sandbox Code Playgroud)
要么
objects_array.sort_by{ |obj| obj.attribute }
Run Code Online (Sandbox Code Playgroud)
降序排列 :
objects_array.sort! { |a, b| b.attribute <=> a.attribute }
Run Code Online (Sandbox Code Playgroud)
要么
objects_array.sort_by{ |obj| obj.attribute }.reverse
Run Code Online (Sandbox Code Playgroud)
bum*_*mbu 20
如果您需要按两个属性进行排序,其中第一个更重要,然后第二个(意味着仅在第一个参数相等时才考虑第二个参数),那么您可能会这样做
myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
Run Code Online (Sandbox Code Playgroud)
或者在数组数组的情况下
myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }
Run Code Online (Sandbox Code Playgroud)
小智 14
您可以通过重写<=>方法使任何类可排序:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(other)
@last_name + @first_name <=> other.last_name + other.first_name
end
end
Run Code Online (Sandbox Code Playgroud)
现在,一个Person对象数组将在last_name上排序.
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
Run Code Online (Sandbox Code Playgroud)
Cur*_*son 10
数组#排序效果很好,如上所述:
myarray.sort! { |a, b| a.attribute <=> b.attribute }
Run Code Online (Sandbox Code Playgroud)
但是,您需要确保<=>
为该属性实现了运算符.如果它是Ruby本机数据类型,这不是问题.否则,编写自己的实现,如果a <b则返回-1,如果相等则返回0,如果a> b则返回1.
归档时间: |
|
查看次数: |
68804 次 |
最近记录: |