2013-02-21 59 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。