[英]why does array.sort{|x,y| y <=> x} sort the array in descending order in Ruby?
我最近遇到了一段使用
array.sort{|x,y| y <=> x}
以降序對整數數組進行排序。 我查找了<=>運算符,並了解它會返回三個不同的值-1、0或1,具體取決於一個值是否小於,大於或等於另一個值。
但是我無法解釋為什么這會使上面的代碼按降序對數組進行排序,但是我知道這確實要歸功於IRB。 這里發生了什么? 有人可以向我解釋嗎?
出於以下相同原因:
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
,將會得到相反的結果。
因為您做了y <=> x,而不是x <=> y。 參數的順序很重要。
我選擇給出一個答案,希望對於大多數Ruby新手來說都是可以理解的。
Array#sort比較數組中的每對元素。 對於每一對元素x,y
, sort
的塊返回-1
如果x
之前y
在排序, 1
如果y
先於x
和0
如果任一可以在另一個的前面。 如果沒有給出塊,則sort
使用該塊:
{ |x,y| x <=> y }
例如,如果x
和y
是字符串,則可以這樣定義方法String#<=> :
class String
def <=>(other)
case
when self < other then -1
when self > other then 1
else 0
end
end
end
同樣,如果x
和y
是數組,則調用Array#<=> ,依此類推。 對於Fixnum
, Bignum
和Float
(它們都是來自Numeric
類),使用方法Numeric#<=> ,以便要排序的數組可以包含這三種數據類型的混合。
如果sort
的塊是:
{ |x,y| y <=> x }
該塊返回此處顯示的值(並顯示默認x <=> y
的值以進行比較):
現在假設我們希望對數組[2,3,1,2]
進行排序。 對於默認sort
, x <=> y
的sort塊返回此處顯示的值:
這導致sort
返回[1,2,2,3]
。 如果排序塊是
{ |x,y| y <=> x }
sort塊返回以下值:
導致sort
返回[3,2,2,1]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.