将ruby数组排序为字母数字

时间:2013-02-21 16:02:28

标签: ruby arrays sorting

我正在尝试按长度和字母数字对Ruby中的数组进行排序:

所需的顺序是:

  • site.com?page=7
  • site.com?page=8
  • site.com?page=9
  • site.com?page=880

我一直在尝试array.sort并排序!但他们似乎都没有做到这一点,因为他们将在8点之后将880放在旁边。

我如何才能以最有效的方式做到这一点?

3 个答案:

答案 0 :(得分: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的第一个匹配后使用字符串的数值(page=)用于分类。

答案 1 :(得分:1)

您可以使用group_by功能按长度对项目进行分组,并sort_by按字母数字顺序在组内进行排序,最后展平群组:

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

答案 2 :(得分: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的任何数字,否则此方法效果很好。