鉴于以下阵列工作红宝石字母排序并不如预期
=> ["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)。 –