按字符串中的数字对Ruby字符串数组进行排序

8
如果我有一个如下所示的字符串数组:
array = ["STRING1", "STRING05", "STRING20", "STRING4", "STRING3"]
或者
array = ["STRING: 1", "STRING: 05", "STRING: 20", "STRING: 4", "STRING: 3"]
如何通过每个字符串中的数字(降序)对数组进行排序?
我知道如果数组由整数而不是字符串组成,我可以使用:
sort_by { |k, v| -k }
我已经搜索了很多但无法找到解决方案。

请澄清数字是否可以有多个数字。如果是,请通过更改示例以包括至少一个大于9的数字来指示。如果不是,则array.sort_by(&:reverse).reverse也可以使用。 - Cary Swoveland
谢谢@CarySwoveland!我明白你的意思了,很高兴知道那个方法可行。 - user3127502
2个回答

22
下面将按每个字符串中的数字而不是字符串本身进行排序。
array.sort_by { |x| x[/\d+/].to_i }
=> ["STRING: 1", "STRING: 2", "STRING: 3", "STRING: 4", "STRING: 5"]

降序排列:

array.sort_by { |x| -(x[/\d+/].to_i) }
=> ["STRING: 5", "STRING: 4", "STRING: 3", "STRING: 2", "STRING: 1"]

2
记得将其转换为整数,否则在比较一位数字和两位数字时会出现意外的排序。 - Gareth
bjhaid,现在很难在你的回答和@xdazz之间做出选择了。 :-) - Cary Swoveland
1
@CarySwoveland 嗯,我先提供了主要思路的答案(比xdazz早4分钟),修改是在评论后进行的,真正重要的是它背后的概念,其余的更改是显而易见的,你可以查看我的编辑历史来确认。 - bjhaid

3
按每个字符串中的数字将数组进行排序(降序)。
array.sort_by { |x| -x[/\d+/].to_i }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接