我最近遇到了一段使用
的代码array.sort{|x,y| y <=> x}
按降序对整数数组进行排序。我查了一下&lt; =&gt;运算符并理解它返回三个不同的值,-1,0或1,具体取决于一个值是否小于,大于或等于另一个值。
但我无法推断为什么这会使上面的代码按降序对数组进行排序,但要知道它肯定要归功于IRB。这里发生了什么?有人可以向我解释一下吗?
答案 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
如果其中任何一个可以先于另一个,则前置0
和sort
。如果没有给出阻止,{ |x,y| x <=> y }
使用阻止:
x
例如,如果y
和class String
def <=>(other)
case
when self < other then -1
when self > other then 1
else 0
end
end
end
是字符串,方法String#<=>可能会定义如下:
x
同样,如果y
和Fixnum
是数组,则会调用Array#<=>,依此类推。对于Bignum
,Float
和Numeric
s(所有这些都来自sort
的类),使用方法Numeric#<=>,以便被排序的数组可以包含这三种数据类型的混合。
如果{ |x,y| y <=> x }
的阻止是:
x <=> y
该块返回此处显示的值(显示默认值[2,3,1,2]
的值以进行比较):
现在假设我们希望对数组sort
进行排序。对于默认的x <=> y
,带有sort
的排序块将返回此处显示的值:
会导致[1,2,2,3]
返回{ |x,y| y <=> x }
。如果排序块是
sort
sort块返回以下值:
导致[3,2,2,1]
返回{{1}}。