Mik*_*ike 3 ruby arrays sorting
让我先说一下我是Ruby的新手(非常明显).我正在学习Ruby on Codecademy,我对sort函数感到困惑.以用作为例:
list = [3,2,1,4]
list.sort { |a,b| b <=> a }
Run Code Online (Sandbox Code Playgroud)
我知道这将按降序返回数组 - [4,3,2,1].我完全不明白为什么.我知道当调用sort函数时,数组中的数字会被传递到函数中并进行比较,然后返回-1,0或1 - 但是接着是什么?例如,我猜这是首先要比较的东西:
[3 <=> 2] = 1
Run Code Online (Sandbox Code Playgroud)
但它对返回的1做了什么呢?在获得1后,阵列会是什么样子?
我很困惑,因为我不明白如何逆转比较(a <=> b与b <=> a)会改变数组的排序方向.除非我弄错了,否则"1 <=> 2"基本上不会返回"1来自2",而"2 <=> 1"则返回"2来自1"?这或多或少是相同的,但结果显然是不同的.
"宇宙飞船"操作员,<=>不会返回"a a before b"之类的英语.它返回sort需要知道的内容:两个元素相互关联的位置.具体来说,它返回您提到的-1,0或1值.
在a <=> b,if a小于b(通过用于其类a的实例的任何比较方法),返回值为-1.如果它们相等,则返回0; 如果a大于b,则返回为1.
当你这样做时b <=> a,返回的值是基于b而不是a,所以如果a更小,你将得到1,而你做得时得到-1 a <=> b.
因此,虽然英语含义相同,但魔鬼在细节中:-1,0或1返回值.该值精确地告诉Ruby两个元素如何适合排序数组.
这三个数字的神奇之处在于Ruby使用的快速排序算法.尝试精确解释该算法的工作方式超出了范围,但您基本上可以将其视为对许多值的简单比较.对于数组中的每个项目,使用数组中的<=>另一个项目进行调用,以确定两个项目相对于彼此的位置.一旦进行了足够的比较,就知道所有这些单独项目的位置并完成排序.
作为一个简单的(并不是技术上准确,但足够接近)的例子,请考虑数组[3, 2, 7, 1].您可以获取一个值来比较其他值,以便开始排序.我们将选择3.运行3与所有其他数字的比较给我们:
3 <=> 2 == 1:3大于2,所以2必须在3的左边.我们的数组现在看起来像这样: [2, 3, 7, 1]3 <=> 7 == -1:3小于7,所以7必须是3的右边.我们的数组继续看起来像之前一样,因为7已经在右边.3 <=> 1 == 1:3大于1,所以1必须在3的左边.我们的数组现在看起来像这样: [2, 1, 3, 7]我们知道7必须是正确的,因为它是"大于3"侧的唯一元素.所以我们只需要弄清楚3:1和2之前所有内容的排序顺序.运行类似的比较,我们显然交换1和2得到[1, 2, 3, 7].
我希望这有帮助!