簡體   English   中英

了解Ruby數組排序語法

[英]Understanding Ruby array sorting syntax

我真的不明白以下排序方法:

books = ["Charlie and the Chocolate Factory", "War and Peace", "Utopia", "A Brief History of Time", "A Wrinkle in Time"]

books.sort! { |firstBook, secondBook| firstBook <=> secondBook }

這如何運作? 在紅寶石書中,它們有一個參數,例如|x| 表示數組中的每個值。 如果有多個參數(在此示例中為firstBook和secondBook),它代表什么?

謝謝!

<=>運算符返回比較結果。

因此, "a" <=> "b"返回-1, "b" <=> "a"返回1,而"a" <=> "a"返回0。

這樣sort才能確定元素的順序。

沒有塊的情況下調用Array#sort (和sort! )將與<=>進行比較,因此該塊是多余的。 這些都完成同一件事:

books.sort!
books.sort_by!{|x| x}
books.sort!{|firstBook, secondBook| firstBook <=> secondBook}

由於您沒有覆蓋默認行為,因此第二和第三種形式不必要地變得復雜。

那么,這一切如何運作?

第一種形式通過使用某種排序算法對數組進行排序-與哪種排序無關-哪種算法需要能夠比較兩個元素以確定哪個先出現。 (有關此內容的更多信息。)它在幕后自動遵循與上面第三行相同的邏輯。

中間的表格讓您選擇排序的依據。 例如:您可以對每個項目的長度進行排序,而不是對每個項目進行排序(這是默認設置):

books.sort_by!{|title| title.length}

然后,將books從最短標題到最長標題排序。 如果您要做的只是在每個項目上調用一個方法,那么還有另一個快捷方式可用。 這做同樣的事情:

books.sort_by!(&:length)

在最終形式中,您可以控制比較本身。 例如,您可以向后排序:

books.sort!{|first, second| second <=> first}

為什么sort需要將兩個項目傳遞到塊中,它們代表什么?

帶有塊的Array#sort (和sort! )是您覆蓋排序比較步驟的方式。 比較順序排序期間在某一點發生搞清楚什么才能把事情。你不需要重寫在大多數情況下比較,但如果這樣做,這是允許的形式,所以它需要將兩個項目傳遞到該塊中:現在需要比較這兩個項目。 讓我們看一個實際的例子:

[4, 3, 2, 1].sort{|x, y| puts "#{x}, #{y}"; x <=> y}

輸出:

4, 2
2, 1
3, 2
3, 4

這向我們展示了在這種情況下, sort比較42 ,然后對21 ,然后對32 ,最后對34 ,以便對數組進行排序。 確切的細節與該討論無關,並且取決於所使用的排序算法,但是同樣,所有排序算法都需要能夠比較項目以便進行排序。

{}內部給定的塊作為方法排序的比較函數傳遞。 | a,b | 告訴我們該比較函數采用2個參數(由於需要比較,因此這是預期的參數數量)。

對於數組中的每個元素都執行此塊,但是如果需要更多參數,則在此之后再取下一個元素。

有關說明,請參見http://ruby-doc.org/core-2.0/Array.html#method-i-sort 至於書中提到的單參數方法,我只能猜測您正在查看sort_by。 能給我舉個例子嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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