2013-02-21 61 views
2

我試圖通過長度和字母數字排序在紅寶石的數組:排序紅寶石數組作爲字母數字

的期望的順序將是:

  • site.com?page=7
  • 站點.COM?頁= 8
  • site.com?page=9
  • site.com?page=880

我一直在嘗試array.sort並進行排序!但他們似乎都沒有做到這一點,因爲他們會在8點之後放置880.

我該如何去做這個最有效的方法?

回答

3

比方說你有一個數組:

a = ["site.com?page=7", "site.com?page=8", "site.com?page=9", "site.com?page=880"] 

然後,你可以這樣做:

a = a.sort_by{|t| t.split(/page=/)[1].to_i} 

總之我使用自定義排序標準,這個標準是由「網頁分割字符串= 「,然後使用page=的第一個匹配後的字符串的數值(to_i)進行排序。

+0

謝謝。雖然恐怕我應該發佈整個URI,因爲頁面只是其中的一個。還有可能做些什麼嗎? – charliexx 2013-02-21 20:21:30

1

可以通過長度使用group_by功能組項目和sort_by它們字母數字組內訂購,最後壓平基團:使用固定

list.group_by {|i| i.length}.sort_by{|i| i.first}.collect {|i| i.last.sort}.flatten 
0

的一般技巧是零墊數排序數組字符串之前的小數位數。

這可以通過下面的代碼很容易地完成:

a = ["site.com?page=9","site.com?page=880""site.com?page=8","site.com?page=7"] 

N = 5 # Maximum number of decimal places allowed 

a.sort_by { |s| s.gsub(/(\d+)/) { |n| sprintf("%0#{N}d", n.to_i) } } 

這非常適用,除非字符串包含任意數量大於或等於10^N。