用冒号对数字进行排序

3

我有一些圣经经文、时间或其他带数字和冒号的字符串列表。 我想将它们排序成这样:

1:5
2:1
2:8
2:14
11:36

如何对这些数字进行排序?

我假设我需要解析字符串,按冒号分隔,然后排序。我尝试过的方法给我类似于这样的结果:

1:5
11:36
2:1
2:14
2:8

3
两个小建议:当您给出示例时,请将所有输入表达为Ruby对象。在这里,它将是["1:5", "11:36", "2:1", "2:14", "2:8"]。如果输入不是有效的Ruby对象,则看到问题被投票降低是很常见的。其次,有助于将变量附加到这些对象上:arr = ["1:5", "11:36", "2:1", "2:14", "2:8"]。这样,我们可以在答案和评论中引用这些变量,而无需定义它们。 - Cary Swoveland
1
按照我所建议的方式表达输入参数,它具有一个额外的好处,即允许读者在准备答案时进行复制和粘贴。 - Cary Swoveland
@CarySwoveland 感谢您的建议。您说得非常正确。 :) - ryanpitts1
@ryanpitts1 如果您这样认为,您应该编辑您的问题并遵循建议。 - sawa
2个回答

9

使用 Enumerable#sort_by 函数。

input = %w|1:5 11:36 2:1 2:14 2:8|
input.sort_by { |e| e.split(':').map(&:to_i) }
#⇒ ["1:5", "2:1", "2:8", "2:14", "11:36"]

map(&:to_i) 部分是必需的,以将字符串转换为整数,因为 11 > 2 但是 "11" < "2"


6
arr = %w| 1:5 11:36 2:1 2:14 2:8 |
  #=> ["1:5", "11:36", "2:1", "2:14", "2:8"]

arr.sort_by { |s| Gem::Version.new(s.tr(':', '.')) }
  #=> ["1:5", "2:1", "2:8", "2:14", "11:36"]

请查看Enumerable#sort_byString#trGem::Version::new。后者是Ruby标准库的一部分。


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