2016-08-02 3 views
0

ich eine Datei haben, die ich in den Werten aus und legen Sie in ein Array lesen, damit ich sie sortieren:Ruby-Sortier Array, um durch integer in Zeichenfolge

input.txt

#75 - Hamilton Ave. 
#12A - Long Road 
#12B - Long Road 
#120 - Curvy Road 

Meine Ruby:

result = [] 
file = open("input.txt").each do | line | 
    result << line 
end 
puts result.sort_by {|x| x.to_i}.reverse 

Ich möchte nach dem Integer-Wert in der Zeichenfolge sortieren. Allerdings kommt der Auftrag aus wie:

#12A - Long Road 
#12B - Long Road 
#120 - Curvy Road 
#75 - Hamilton Ave. 

Statt:

#12A - Long Road 
#12B - Long Road  
#75 - Hamilton Ave. 
#120 - Curvy Road 

Soll ich irgendeine Art von Regex sein mit dem String eval beim Sortieren?

+2

Ist "#" das erste Zeichen jeder Zeile? Wenn nicht, sollten Sie das ändern. "# 123anything" 'wird immer Null sein. –

+0

Ja, es ist Teil der Zeichenfolge – porterhaus

+1

Dann wollen Sie 'result.sort_by {| x | x [1 ..- 1]. to_i} .reverse ". Zum Beispiel "# 74 - Hamilton Ave." [1 ..- 1] # => "74 - Hamilton Ave.". –

Antwort

4

einen regulären Ausdruck wie /\d+/ Mit den Ziffern aus der Zeichenkette zu extrahieren und to_i es in eine ganzen Zahl drehen, z.B .:

input.each_line.sort_by {|line| line[/\d+/].to_i } 

12A zu halten, bevor 12B, einen Array aus dem Block, z.B. [ line[/\d+/].to_i, line ]. Wenn zwei Zeilen dieselbe Ganzzahl haben, ordnet sie diese beiden Zeilen alphabetisch an. Dies setzt voraus, dass vor den betreffenden Ziffern nur ein # vorhanden ist und dass jede Zeile mindestens eine Ziffer hat.

input = <<END 
#75 - Hamilton Ave. 
#12A - Long Road 
#12B - Long Road 
#120 - Curvy Road 
END 

result = input.each_line.sort_by do |line| 
    [ line[/\d+/].to_i, line ] 
end 

p result 
# => [ "#12A - Long Road\n", 
#  "#12B - Long Road\n", 
#  "#75 - Hamilton Ave.\n", 
#  "#120 - Curvy Road\n" ] 

Wurf map(&:chomp) in dort, wenn Sie die \n s loswerden wollen.

+0

Genau das habe ich mir gedacht. Obwohl statt Iteration und dann 'map' würde ich einfach mit' input.split ("\ n") gehen. Sort_by .... ' – engineersmnky

+0

Das hat super funktioniert. @engineersmnky Ihr früherer Vorschlag hat auch funktioniert. Ist ein Ansatz besser als der andere? Fragen für zukünftige Referenz ... Ich werde dies als Antwort markieren und werde die obige Antwort auch upvote, wenn ich das tun kann. – porterhaus

+1

@porterhaus Ich bevorzuge oft 'each_line', weil es einfach über die Zeilen iteriert, anstatt sie alle in den Speicher zu laden, wie 'split (" \ n ")' tut. In diesem Fall macht es jedoch keinen Unterschied, da "sort_by" sie alle sowieso in den Speicher lädt. (Achten Sie auch auf Windows-Stil Zeilenenden, d. H. '\ R \ n', wenn Sie' split' verwenden.) –