2014-10-09 58 views
1

爲什麼可以正確排序string.to_float值的數組,但是當'% .3f'%string.to_float或者包括sprintf,Kernel.format在內的任何變體都可以使用?浮點值的字符串數組可以正確地對負數進行排序,但使用sprintf,kernel.format等可以正確排序相同的值

我該如何解決這個問題?

我目前的工作,讓你包含寫滿數字行的文本文件(例)是一個挑戰:

1.123 -3.010 3.999 -2.199 -1.212 2.190 4.121 0.000

我的目標是對這些數字進行排序並將它們打印到控制檯上。

我的第一個嘗試是首先將這些行分割爲各自的字符串編號,然後使用.to_f將它們轉換爲浮點值,最後對它們進行排序並將它們連接在一起(空格分隔)。

這看起來是這樣的:

line.chomp.split(" ").map { |e| e.to_f }.sort!.join(" ") 

這很好工作,直到我意識到,在精確小數點後三位結束任何數字,如68.060會失去最後爲零。因此顯示爲68.06而不是68.060,這使解決方案失效。

我繞到果然發現大量引用於:

Kernel.format('%.3f', num) 

sprintf '%.3f' % num 

這是完美的,他們解決了這個問題。我申請它們的方式(試圖改變,但是他們都做同樣的事情):

line.chomp.split(" ").map { |e| sprintf '%.3f', e }.sort!.join(" ") 

然後我發現自己在看另一個問題雖然。每一行,這是看跌的控制檯現在組織了負數,好像他們是正數,所以不是:

-3.010 -2.199 -1.212 0.000 1.123 2.190 3.999 4.121

在控制檯上,我看到:

-1.212 -2.199 -3.010 0.000 1.123 2.19 3.999 4.121

這一次我找不到畝選擇。這可能是我的錯,因爲我不知道如何放在谷歌上,但我的搜索沒有發現任何相關的內容。

回答

1

您正在對之後的數組進行排序,您已將其格式化爲一個字符串數組。這意味着你的數組按字典順序排列元素,而不是數字排序。

您應該將陣列的第一映射到浮點值,然後對它進行排序:

line.chomp.split(" ").map(&:to_f).sort 

現在,您可以格式化適當數量:

line.chomp.split(" ").map(&:to_f).sort.map { |e| sprintf '%.3f', e }.join(" ") 
+0

我希望不要有使用兩個地圖完成它!謝謝! – santanaG 2014-10-09 13:36:06

0

您正在對它們進行排序,這會導致您對字符串進行排序而不是浮點數。只需先執行排序,然後映射到字符串:)

相關問題