阵列我有红宝石的阵列如下排序在红宝石(特殊情况)
xs = %w(2.0.0.1
2.0.0.6
2.0.1.10
2.0.1.5
2.0.0.8)
等具有的值。我想对数组进行排序,使得最终的结果应该是这样的:
ys = %w(2.0.0.1
2.0.0.6
2.0.0.8
2.0.1.5
2.0.1.10)
我已经使用array.sort
功能试过,但它"2.0.1.5"
前将"2.0.1.10"
。我不知道为什么会发生这种情况
阵列我有红宝石的阵列如下排序在红宝石(特殊情况)
xs = %w(2.0.0.1
2.0.0.6
2.0.1.10
2.0.1.5
2.0.0.8)
等具有的值。我想对数组进行排序,使得最终的结果应该是这样的:
ys = %w(2.0.0.1
2.0.0.6
2.0.0.8
2.0.1.5
2.0.1.10)
我已经使用array.sort
功能试过,但它"2.0.1.5"
前将"2.0.1.10"
。我不知道为什么会发生这种情况
使用整数数组定义的lexicographical order的Schwartzian transform(Enumerable#sort_by),并利用(Array#<=>):
sorted_ips = ips.sort_by { |ip| ip.split(".").map(&:to_i) }
能否请你解释一下更加精心
你不能比较包含数字的字符串:"2" > "1"
,是的,但012因为字符串按字典顺序进行比较,就像字典中的单词一样。因此,您必须将ip转换为可比较的内容(整数数组):ip.split(".").map(&:to_i)
。例如"1.2.10.3"
转换为[1, 2, 10, 3]
。我们称之为f
。
您现在可以使用Enumerable#sort
:ips.sort { |ip1, ip2| f(ip1) <=> f(ip2) }
,但请检查始终是否可以使用更高的抽象Enumerable#sort_by
。在这种情况下:ips.sort_by { |ip| f(ip) }
。您可以将其读取为“采取ips
并按照f
映射定义的顺序对它们进行排序”。
你能否请详细解释一下 –
通过拆分'.'
将数据拆分为块。没有这样做的标准功能,所以你需要编写一个自定义的排序来执行此操作。
而且您在2.0.1.5
之前所说的关于2.0.1.10
的行为是预期的,因为它将数据作为字符串并进行ASCII比较,从而导致您看到的结果。
arr1 = "2.0.0.1".split('.')
arr2 = "2.0.0.6".split('.')
的元素都比较和arr1
元素arr2
,在你输入的所有数据。
只有数字是数组元素?或者点也是?如果您可以将您的数组符号重构为正确的,我相信我们可以更好地帮助您。 – MurifoX
值都是字符串,因为它们之间也包含一个点。 –