鑑於以下陣列工作紅寶石字母排序並不如預期
=> ["A1", "A2", "A6", "A8", "B3", "B4", "B5", "B8", "B10", "B12"]
使用以下(香草)排序,我得到:
irb(main):2557:0> y.sort{|a,b| puts "%s <=> %s = %s\n" % [a, b, a <=> b]; a <=> b}
A1 <=> A8 = -1
A8 <=> B8 = -1
A2 <=> A8 = -1
B5 <=> A8 = 1
B4 <=> A8 = 1
B3 <=> A8 = 1
B10 <=> A8 = 1
B12 <=> A8 = 1
A6 <=> A8 = -1
A1 <=> A2 = -1
A2 <=> A6 = -1
B12 <=> B3 = -1
B3 <=> B8 = -1
B5 <=> B3 = 1
B4 <=> B3 = 1
B10 <=> B3 = -1 # this appears to be wrong, looks like 1 is being compared, not 10.
B12 <=> B10 = 1
B5 <=> B4 = 1
B4 <=> B8 = -1
B5 <=> B8 = -1
=> ["A1", "A2", "A6", "A8", "B10", "B12", "B3", "B4", "B5", "B8"]
......這顯然不是我所希望的。我知道我可以嘗試首先在alpha上分割,然後對數值進行排序,但似乎我不應該那樣做。
可能重要的提醒:我們使用Ruby卡住1.8.7現在:(但即使紅寶石2.0.0做同樣的事情缺少什麼我在這裏
建議
您的第一個預感是正確的;因爲這些是字符串,它們將按照字典順序排列。如果你想把這個數字作爲排序的一個元素,你需要將這個數字與數字分開,並在分類時使用它自己的意願。 – Makoto
我很好奇你爲什麼認爲*字符串*「B12」會在*字符串*「B2」之前排序。這不是Ruby如何對字符串進行排序的方式,這就是* everything *字符串的排序方式。 – meagar
你想'y.sort_by {| s | [s [0],s [1..-1] .to_i]}#=> [「A1」,「A2」,「A6」,「A8」,「B3」,「B4」,「B5」 「B8」,「B10」,「B12」]。關於Ruby如何對數組進行排序,請參見[Array#<=>](http://ruby-doc.org/core-2.3.0/Array.html#method-i-3C-3D-3E)。 –