我正在尝试按长度和字母数字对 Ruby 中的数组进行排序:
所需的顺序是:
- site.com?page=7
- site.com?page=8
- site.com?page=9
- site.com?page=880
我一直在尝试 array.sort 和 sort!但他们似乎都没有成功,因为他们会将 880 放在 8 之后。
我将如何以最有效的方式做到这一点?
假设你有一个数组:
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}
to_i
简而言之,我使用自定义排序标准,该标准是将字符串按“page=”拆分,然后在第一次匹配后使用字符串的数值( )page=
进行排序。
您可以使用该group_by
函数按长度sort_by
对项目进行分组,并在组内按字母数字顺序对它们进行排序,最后将组展平:
list.group_by {|i| i.length}.sort_by{|i| i.first}.collect {|i| i.last.sort}.flatten
一个通用技巧是在对数组字符串进行排序之前使用固定的小数位数对数字进行零填充。
这可以通过以下代码轻松完成:
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 的数字,否则此方法效果很好。