https://stackoverflow.com/a/11427868/936494上已經有一個相關問題,但我想了解的是
使用時
a.sort { |x, y| x <=> y }
它如何知道這個塊應該按升序排序,并且在使用時類似
a.sort { |x, y| y <=> x }
它怎么知道這個塊應該按降序排序?我很困惑,因為這兩個塊都使用了飛船運算子,并且在每次比較期間預計會回傳以下內容,以防萬一a.sort { |x, y| x <=> y }
- -1 如果 x < y
- 0 如果 x == y
- 1 如果 x > y
并在每次比較期間遵循以下情況 a.sort { |x, y| y <=> x }
- -1 如果 y < x
- 0 如果 y == x
- 1 如果 y > x
現在讓我們舉一個例子陣列:
2.3.2 :023 > a = [ "d", "a", "e", "c", "b" ]
=> ["d", "a", "e", "c", "b"]
當我們使用a.sort { |e1, e2| p [e1, e2]; e1 <=> e2 }以下方法對其進行排序時,結果是:
["d", "a"] (cmp result: 1)
["c", "b"] (cmp result: 1)
["e", "b"] (cmp result: 1)
["e", "c"] (cmp result: 1)
["a", "b"] (cmp result: -1)
["d", "b"] (cmp result: 1)
["d", "c"] (cmp result: 1)
["d", "e"] (cmp result: -1)
=> ["a", "b", "c", "d", "e"]
現在在這種情況下,它如何知道將“a”放在第一位,然后是“b”,然后是“c”,等等?
同樣,當我們使用a.sort { |e1, e2| p [e2, e1]; e2 <=> e1 }以下對其進行排序時,結果是:
["a", "d"] (cmp result: -1)
["b", "c"] (cmp result: -1)
["c", "e"] (cmp result: -1)
["e", "d"] (cmp result: 1)
["c", "d"] (cmp result: -1)
["c", "a"] (cmp result: 1)
["b", "a"] (cmp result: 1)
=> ["e", "d", "c", "b", "a"]
那么在這種情況下,它如何知道將“e”放在第一位,然后是“d”,然后是“c”,等等?考慮到兩個塊中的兩個元素的比較應該回傳 1、0 或 -1 的事實?
uj5u.com熱心網友回復:
它如何知道將“e”放在第一位,然后是“d”,然后是“c”
從比較器塊,就是這樣。在你自己的例子:["a", "d"] (cmp result: -1)。這個 -1 告訴排序"d"應該在"a". 后來比較"d"到"e",獲取1,而獲悉"d"應該跟從"e"。等等。
uj5u.com熱心網友回復:
使用時
a.sort { |x, y| x <=> y }它怎么知道這個塊應該按升序排序
Array#sort 不知道。該塊只是告訴Array#sort兩個元素中的哪個元素“小于”另一個元素。而已。
換句話說:是塊定義了“升序”的含義。
同樣在使用時
a.sort { |x, y| y <=> x }它怎么知道這個塊應該按降序排序?
它不是按降序排列的。它是按塊中實作的排序關系定義的升序排列的。
uj5u.com熱心網友回復:
塊回傳的值告訴sort串列中哪個元素排在最前面。如果塊回傳1,則意味著第一個塊引數將被視為“大于”第二個塊引數,因此在排序結果中第一個塊引數必須在第二個引數之后。
一件有趣的事情是 Ruby 的sort演算法利用了比較的傳遞特性:在您的第一個示例中,它從未直接比較“a”和“c”,但它的其他比較表明“a”<“b”和“b” " < "c" 所以它把 "c" 放在結果中的 "a" 之后。
該運算式y <=> x等效于-(x <=> y)(假設兩個物件的類都實作了合理的飛船運算子)。所以如果你 sort by y <=> x,所有單獨的比較都會被反轉,并且排序的陣列必須是相反的順序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384815.html
