arrays - 传递 block 时 Array#sort 如何工作?

标签 arrays ruby sorting

我在理解 array.sort{ |x,y| 的方式时遇到问题 block } 工作正常,因此如何使用它?

来自 Ruby documentation 的示例:

   a = [ "d", "a", "e", "c", "b" ]
   a.sort                     #=> ["a", "b", "c", "d", "e"]
   a.sort { |x,y| y <=> x }   #=> ["e", "d", "c", "b", "a"]

最佳答案

在你的例子中

a.sort

相当于

a.sort { |x, y| x <=> y }

如您所知,要对数组进行排序,您需要能够比较其元素(如果您怀疑这一点,只需尝试在不使用任何比较的情况下实现任何排序算法,不是 <><=>= )。

您提供的 block 实际上是一个函数,sort 算法将调用该函数来比较两个项目。 xy 将始终是 sort 算法在执行期间选择的输入数组的一些元素。

sort 算法将假定此比较函数/ block 将满足方法 <=> 的要求:

  • 如果 x < y 则返回 -1
  • 如果 x = y 则返回 0
  • 如果 x > y 则返回 1

未能提供足够的比较函数/ block 将导致数组的顺序未定义。

你现在应该明白为什么了

a.sort { |x, y| x <=> y }

a.sort { |x, y| y <=> x }

以相反的顺序返回相同的数组。


详细说明 Tate Johnson 添加的内容,如果您在任何类上实现比较函数 <=>,您将获得以下内容

  1. 您可以在类中包含模块 Comparable,它将自动为您定义以下方法:between?==>=<<=>
  2. 现在可以使用对 sort 的默认(即不带参数)调用对您的类的实例进行排序。

请注意,在 ruby​​ 的标准库(<=>BignumArrayFile::StatFixnumString 等)中任何有意义的地方都已经提供了 Time 方法。

关于arrays - 传递 block 时 Array#sort 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2637419/

相关文章:

c++ - 如何使用数值数组文字

css - 如何在 Nokogiri 中找到 ComputedStyle 元素?

c - C 中整数数组的 shell 排序

java - 使用比较器排序映射导致语法错误

php - 将一个元素移动到数组的末尾

c - 指针数组 - 需要更大

java - 2 个 vector 之间的欧氏距离实现

java - 获取数组第二维的长度

ruby-on-rails - #<Array : 的未定义方法 `with_indifferent_access'

mysql - redmine 安装步骤 5.rake generate_secret_token 的问题