【发布时间】:2023-03-25 04:33:01
【问题描述】:
给定以下数组:
y = %w[A1 A2 B5 B12 A6 A8 B10 B3 B4 B8]
=> ["A1", "A2", "B5", "B12", "A6", "A8", "B10", "B3", "B4", "B8"]
预期的排序数组为:
=> ["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 :( 但即使是 Ruby 2.0.0 也在做同样的事情。我在这里错过了什么?
建议?
【问题讨论】:
-
你的第一个预感是正确的;由于这些是字符串,它们将按字典顺序排列。如果您想将数字作为排序的元素考虑在内,则需要将字母与数字分开,并在排序时根据自己的意愿使用。
-
我很好奇你为什么认为 string "B12" 会排在 string "B2" 之前。这不是 Ruby 对字符串进行排序的方式,而是 everything 对字符串进行排序的方式。
-
你想要
y.sort_by { |s| [s[0], s[1..-1].to_i] } #=> ["A1", "A2", "A6", "A8", "B3", "B4", "B5", "B8", "B10", "B12"]。请参阅Array#<=> 了解 Ruby 如何对数组进行排序。
标签: arrays ruby sorting alphanumeric