簡體   English   中英

為什么array.sort {| x,y | y <=> x}在Ruby中按降序對數組進行排序?

[英]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,ysort的塊返回-1如果x之前y在排序, 1如果y先於x0如果任一可以在另一個的前面。 如果沒有給出塊,則sort使用該塊:

{ |x,y| x <=> y }

例如,如果xy是字符串,則可以這樣定義方法String#<=>

class String
  def <=>(other)
    case
    when self < other then -1
    when self > other then  1
    else 0
    end
  end
end

同樣,如果xy是數組,則調用Array#<=> ,依此類推。 對於FixnumBignumFloat (它們都是來自Numeric類),使用方法Numeric#<=> ,以便要排序的數組可以包含這三種數據類型的混合。

如果sort的塊是:

{ |x,y| y <=> x }

該塊返回此處顯示的值(並顯示默認x <=> y的值以進行比較):

在此處輸入圖片說明

現在假設我們希望對數組[2,3,1,2]進行排序。 對於默認sortx <=> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM