📅  最后修改于: 2023-12-03 15:41:11.739000             🧑  作者: Mango
在红宝石中,sort()
函数是用来对数组进行排序的常用方法之一。除了常规的排序方式,sort()
函数还提供了一些可枚举的选项来控制排序的行为。
sort()
函数的基本用法非常简单,它只需要一个可迭代的对象作为参数即可:
arr = [5, 2, 8, 1, 9]
arr.sort()
# 输出:[1, 2, 5, 8, 9]
默认情况下,sort()
函数使用升序排序。如果要进行降序排序,可以使用块表达式:
arr.sort { |a, b| b <=> a }
# 输出:[9, 8, 5, 2, 1]
在块表达式中,我们比较了两个元素a
和b
,用<=>
(类似于cmp
)符号表示它们之间的大小关系。根据上面的规则,如果b <=> a
返回-1
,那么b
就会被排在a
的前面。
除了块表达式外,sort()
函数还提供了其他一些可枚举的选项,以控制排序的行为。
如果需要在原始数组上进行排序,而不是创建一个新的已排序数组,那么可以使用in_place
选项:
arr = [5, 2, 8, 1, 9]
arr.sort! { |a, b| b <=> a }
# 输出:[9, 8, 5, 2, 1]
puts arr
# 输出:[9, 8, 5, 2, 1]
注意,这里要使用sort!
而不是sort
,因为sort!
是在原始数组上进行排序的。
如果只是想简单地将数组反转,那么可以使用reverse
选项:
arr = [5, 2, 8, 1, 9]
arr.sort.reverse
# 输出:[9, 8, 5, 2, 1]
注意,这里的sort()
函数是用来升序排序的,而reverse
选项只是将排序后的数组反转了一下。
如果需要根据某个键或者属性进行排序,可以使用sort_by
选项:
class Person
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
people = [ Person.new("Jane", 22), Person.new("John", 32), Person.new("Mary", 28) ]
people.sort_by { |person| person.age }
# 输出:[ #<Person:0x00007fb42d876728 @name="Jane", @age=22>, #<Person:0x00007fb42d8766b0 @name="Mary", @age=28>, #<Person:0x00007fb42d8767a8 @name="John", @age=32> ]
在这个例子中,我们定义了一个Person
类,并将其实例放入到一个数组中。接着,我们使用sort_by
选择器,来根据每一个Person
对象的age
属性进行排序。
与sort!
类似,sort_by!
也是在原始数组上进行排序的:
people = [ Person.new("Jane", 22), Person.new("John", 32), Person.new("Mary", 28) ]
people.sort_by! { |person| person.age }
puts people.inspect
# 输出:[#<Person:0x00007fa0ae83ee48 @name="Jane", @age=22>, #<Person:0x00007fa0ae83ebe8 @name="Mary", @age=28>, #<Person:0x00007fa0ae83f2c0 @name="John", @age=32>]
sort()
函数为红宝石提供了一种灵活而又强大的排序方式。除了常规的排序方法外,它还提供了一些可枚举的选项(如in_place
、reverse
、sort_by
等),来满足不同的排序需求。