Ruby 对ID值字符串进行数字排序

Ruby 对ID值字符串进行数字排序,ruby,string,sorting,integer,Ruby,String,Sorting,Integer,我有以下字符串数组: 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

我有以下字符串数组:

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”中小数点的数量。
任何帮助都将不胜感激。谢谢

您可以使用rubygems版本比较:

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"] 

您可以使用以下内容:

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"]
这有点像:

[[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]]

有关排序结果的说明,请参阅。

在每个值中,您可以使用“.”上的“拆分”将其转换为数组,并映射为整数,整数数组数组将按照您的要求进行排序。是的,它是重复的。我知道@SergioTulentsev有一个很好的答案。这个问题唯一不同的是小数点的数量不能保证。但另一个问题的答案是相同的,并且不受“#.#.#.#”格式的限制。Cary的答案与此类似,在三个方面具有优势:1)可以通过方法链接避免分配局部变量2)不需要正则表达式进行拆分;一个字符串就足够了3)你不需要转换成浮点;转换为整数就足够了。但是,到目前为止,请不要编辑您的答案来反映这一点,因为这将使您的答案仅与Cary的答案重复(使用带有
符号的
&
,到#proc
是一个优先事项)。@sawa是的,出于同样的原因,我决定不编辑它。很好。不需要。您的回答说明了被确定为重复的结束问题的一个弱点:它会阻止新的、新颖的解决方案被看到。当然,你可以发布你的解决方案作为原始问题的答案,但是谁会看到呢?
[[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]]