【问题标题】:Sorting a string of ID values numerically [duplicate]对一串ID值进行数字排序[重复]
【发布时间】:2015-12-21 03:05:16
【问题描述】:

我有以下字符串数组:

x = ["1.2", "1.1", "1.18", "1.18.3", "1.4", "1.18.20", "2.5"]

Ruby 的数组排序方法是按字母顺序对字符串进行排序,结果如下:

[
[0] "1.1",
[1] "1.18",
[2] "1.18.20",
[3] "1.18.3",
[4] "1.2",
[5] "1.4",
[6] "2.5",
]

我想根据每个小数内的数值对该数组进行排序,使其返回以下顺序:

[
[0] "1.1",
[1] "1.2",
[2] "1.4",
[3] "1.18",
[4] "1.18.3",
[5] "1.18.20",
[6] "2.5"
]

我也不能保证每个“ID”中的小数位数。 任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 在每个值中,您可以在“.”上使用拆分。将它们转换为数组,并将映射转换为整数,整数数组的数组将按照您需要的方式排序。
  • 是的,它是重复的。我看到@SergioTulentsev 有一个很好的答案。
  • 这个问题唯一不同的是,小数点的个数不能保证。但是另一个问题的答案是相同的,并且不限于“#.#.#”格式。

标签: ruby string sorting integer


【解决方案1】:
x.sort_by { |s| s.split('.').map(&:to_i) }
  #=> ["1.1", "1.2", "1.4", "1.18", "1.18.3", "1.18.20", "2.5"]

这样排序:

[[1,1], [1,2], [1,4], [1,18,3], [1,18,20], [2,5]].sort
  #=> [[1, 1], [1, 2], [1, 4], [1, 18, 3], [1, 18, 20], [2, 5]]

有关排序结果的说明,请参阅Array#<=>

【讨论】:

    【解决方案2】:

    您可以为此使用 ruby​​gems 版本比较:

    x = ["1.2", "1.1", "1.18", "1.18.3", "1.4", "1.18.20", "2.5"]
    x.sort_by { |i| Gem::Version.new(i) }
    # => ["1.1", "1.2", "1.4", "1.18", "1.18.3", "1.18.20", "2.5"] 
    

    【讨论】:

    • 不错。不需要。您的回答说明了关闭被识别为重复的问题的弱点:它可以防止看到新的、新颖的解决方案。当然,您可以发布您的解决方案作为原始问题的答案,但谁会看到呢?
    【解决方案3】:

    你可以这样使用:

    x.sort_by { |n|
      numbers = n.split(/\./)
      numbers.map { |a| a.to_f }
    }
    # => ["1.1", "1.2", "1.4", "1.18", "1.18.3", "1.18.20", "2.5"]
    

    【讨论】:

    • Cary 的回答与此类似,在三个方面更胜一筹:1)您可以避免通过方法链接分配局部变量 2)您不需要正则表达式来拆分;一个字符串就足够了 3)您不需要转换为浮点数;转换为整数就足够了。但是,到目前为止,请不要编辑您的答案以反映这一点,因为这会使您的答案仅与 Cary 的重复(使用 &amp;Symbol#to_proc 是一个偏好问题)。
    • @sawa 是的,出于同样的原因,我决定不编辑它。
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多