2016-08-02 90 views
0

我已經得到了我的價值從閱讀並放入數組中的文件,這樣我就可以對它們進行排序:紅寶石的整數字符串數組排序順序

input.txt中

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

我紅寶石:

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

我想按字符串中的整數值進行排序。然而,爲了出來爲:

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

相反的:

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

我應該使用某種形式的正則表達式的排序時EVAL字符串?

+2

「#」是每行的第一個字符嗎?如果沒有,你應該編輯出來。 '「#123anything」'將始終爲零。 –

+0

是的,它是字符串的一部分 – porterhaus

+1

然後你想'result.sort_by {| x | X [1 ..- 1] .to_i} .reverse'。例如'「#74 - Hamilton Ave。」[1 ..- 1]#=>「74 - Hamilton Ave.」。 –

回答

4

使用正則表達式像/\d+/從字符串中提取數字和to_i把它變成一個整數,例如:

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

爲了保持12A12B之前,從塊,例如返回一個數組[ line[/\d+/].to_i, line ]。這樣,如果兩行有相同的整數,它將按字母順序排列這兩行。假定在有問題的數字之前將只有一個#,並且每行至少有一個數字。

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" ] 

map(&:chomp)在那裏,如果你想擺脫\n S的。

+0

這正是我的想法。雖然不是迭代,然後'map',我只需要使用'input.split(「\ n」)。sort_by ....' – engineersmnky

+0

這很好用。 @engineersmnky你以前的建議也起作用。一種方法比另一種更健全嗎?詢問未來的參考......我打算將此標記爲答案,並且如果我能做到這一點,也會提高上面的答案。 – porterhaus

+1

@porterhaus我經常更喜歡'each_line',因爲它只是遍歷行,而不是像split(「\ n」)那樣將它們全部加載到內存中。然而,在這種情況下,它並沒有什麼不同,因爲'sort_by'會將它們全部加載到內存中。 (當使用'split'時,還要注意Windows風格的行尾,例如'\ r \ n')。 –