![](/img/trans.png)
[英]Need help understanding what is happening in this Array sorting ruby code?
[英]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
比較4
和2
,然后對2
和1
,然后對3
和2
,最后對3
和4
,以便對數組進行排序。 確切的細節與該討論無關,並且取決於所使用的排序算法,但是同樣,所有排序算法都需要能夠比較項目以便進行排序。
{}內部給定的塊作為方法排序的比較函數傳遞。 | 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.