für das folgende Array:Rubin alphanumerische Sortierung nicht wie erwartet funktioniert
y = %w[A1 A2 B5 B12 A6 A8 B10 B3 B4 B8]
=> ["A1", "A2", "B5", "B12", "A6", "A8", "B10", "B3", "B4", "B8"]
Mit der erwarteten sortiert Array zu sein:
=> ["A1", "A2", "A6", "A8", "B3", "B4", "B5", "B8", "B10", "B12"]
Unter Verwendung der folgenden (Vanille) Art, die ich erhalten:
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"]
... was offensichtlich nicht das ist, was ich begehre. Ich weiß, dass ich versuchen kann, zuerst auf Alpha zu splitten und dann die Zahlen zu sortieren, aber es scheint so, als müsste ich das nicht tun.
Mögliche großer Nachteil: wir Rubin stecken mit 1.8.7 für jetzt :(Aber auch Ruby-2.0.0 ist das Gleiche zu tun, was ich hier fehlt
Vorschläge
Ihre erste Ahnung ist die richtige; Da dies Strings sind, werden sie lexikografisch geordnet. Wenn Sie die Nummer als Element der Bestellung berücksichtigen möchten, müssen Sie den Buchstaben von der Nummer trennen und beim Sortieren nach eigenem Ermessen verwenden. – Makoto
Ich bin gespannt, warum Sie denken, die * Zeichenfolge * "B12" würde vor der * Zeichenfolge * "B2" sortiert werden. So sortiert Ruby keine Strings, so sortiert * everything * Strings. – meagar
Sie möchten 'y.sort_by {| s | [s [0], s [1 ..- 1] .to_i]} # => ["A1", "A2", "A6", "A8", "B3", "B4", "B5", "B8", "B10", "B12"] '. In [Array # <=>] (http://ruby-doc.org/core-2.3.0/Array.html#method-i-3C-3D-3E) finden Sie Informationen dazu, wie Ruby Arrays sortiert. –