为什么array.sort {| x,y | y< => x}在Ruby中按降序排序数组?

时间:2014-07-11 01:39:07

标签: ruby arrays sorting

我最近遇到了一段使用

的代码
array.sort{|x,y| y <=> x}

按降序对整数数组进行排序。我查了一下&lt; =&gt;运算符并理解它返回三个不同的值,-1,0或1,具体取决于一个值是否小于,大于或等于另一个值。

但我无法推断为什么这会使上面的代码按降序对数组进行排序,但要知道它肯定要归功于IRB。这里发生了什么?有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:2)

出于同样的原因:

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

按升序排序。


以此程序为例:

[1,5,2,4,3].sort do |x,y|
  puts "---"
  puts x
  puts y
  puts x <=> y
  x <=> y
end

它将输出它正在比较的两个数字,然后输出排序期间<=>的结果。它输出:

---
1
2
-1 # 1 is less than 2
---
2
3
-1 # 2 is less than 3
---
5
2
1 # 5 is greater than 1
---
4
2
1 # 4 is greater than 2
---
5
4
1 # 5 is greater than 4
---
4
3
1 # 4 is greater than 3

如果您将x <=> y的顺序反转为y <=> x,则会得到相反的结果。

答案 1 :(得分:1)

因为你做了&lt; =&gt; x,而不是x&lt; =&gt;年。论证顺序很重要。

答案 2 :(得分:0)

我选择给出一个我希望大多数Ruby新手都能理解的答案。

Array#sort比较数组中的每对元素。对于每对元素x,y,如果sort在排序-1之前x y 1,则y的块返回x如果其中任何一个可以先于另一个,则前置0sort。如果没有给出阻止,{ |x,y| x <=> y } 使用阻止:

x

例如,如果yclass String def <=>(other) case when self < other then -1 when self > other then 1 else 0 end end end 是字符串,方法String#<=>可能会定义如下:

x

同样,如果yFixnum是数组,则会调用Array#<=>,依此类推。对于BignumFloatNumeric s(所有这些都来自sort的类),使用方法Numeric#<=>,以便被排序的数组可以包含这三种数据类型的混合。

如果{ |x,y| y <=> x } 的阻止是:

x <=> y

该块返回此处显示的值(显示默认值[2,3,1,2]的值以进行比较):

enter image description here

现在假设我们希望对数组sort进行排序。对于默认的x <=> y,带有sort的排序块将返回此处显示的值:

enter image description here

会导致[1,2,2,3]返回{ |x,y| y <=> x } 。如果排序块是

sort

sort块返回以下值:

enter image description here

导致[3,2,2,1]返回{{1}}。