推荐答案
在 Ruby 中,sort 和 sort_by 是用于对数组进行排序的两种常用方法。
sort 方法
sort 方法用于对数组中的元素进行排序。默认情况下,它使用 <=> 操作符进行比较,返回一个新的已排序数组。
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_numbers = numbers.sort puts sorted_numbers.inspect # 输出: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
你也可以传递一个块给 sort 方法,自定义排序逻辑:
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = numbers.sort { |a, b| b <=> a }
puts sorted_numbers.inspect
# 输出: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]sort_by 方法
sort_by 方法允许你根据某个特定的属性或计算值对数组进行排序。它接受一个块,块中的表达式将用于排序。
words = ["apple", "banana", "cherry", "date"]
sorted_words = words.sort_by { |word| word.length }
puts sorted_words.inspect
# 输出: ["date", "apple", "banana", "cherry"]sort_by 通常比 sort 更高效,因为它只需要计算一次排序键,而不是在每次比较时都计算。
本题详细解读
sort 方法详解
sort方法默认使用<=>操作符进行比较,该操作符返回 -1、0 或 1,分别表示小于、等于或大于。- 你可以通过传递一个块来定义自定义的排序逻辑。块应该返回 -1、0 或 1,类似于
<=>操作符的行为。 sort方法的时间复杂度通常为 O(n log n),具体取决于底层实现。
sort_by 方法详解
sort_by方法通过计算每个元素的排序键来进行排序。排序键可以是元素的某个属性,或者通过块中的表达式计算得出的值。sort_by方法的时间复杂度也是 O(n log n),但由于它只需要计算一次排序键,因此在某些情况下比sort更高效。sort_by方法特别适用于需要对复杂对象进行排序的场景,例如根据对象的某个属性进行排序。
选择 sort 还是 sort_by
- 如果你需要对数组进行简单的排序,或者排序逻辑较为复杂,可以使用
sort。 - 如果你需要根据某个特定的属性或计算值进行排序,
sort_by通常是更好的选择,因为它更简洁且高效。
示例对比
// www.javascriptcn.com code example
# 使用 sort
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = numbers.sort { |a, b| a <=> b }
puts sorted_numbers.inspect
# 输出: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
# 使用 sort_by
words = ["apple", "banana", "cherry", "date"]
sorted_words = words.sort_by { |word| word.length }
puts sorted_words.inspect
# 输出: ["date", "apple", "banana", "cherry"]通过这两个示例,你可以看到 sort 和 sort_by 在不同场景下的应用。