Pi *_*rse 2 ruby arrays ruby-on-rails ruby-on-rails-3
我在Ruby中有一个数组,其值如下
xs = %w(2.0.0.1
2.0.0.6
2.0.1.10
2.0.1.5
2.0.0.8)
Run Code Online (Sandbox Code Playgroud)
等等.我想对数组进行排序,以便最终结果应该是这样的:
ys = %w(2.0.0.1
2.0.0.6
2.0.0.8
2.0.1.5
2.0.1.10)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用该array.sort
功能,但它"2.0.1.10"
之前放置过"2.0.1.5"
.我不确定为什么会这样
tok*_*and 18
使用Schwartzian变换(Enumerable#sort_by),并利用由整数数组(Array#<=>)定义的词典顺序:
sorted_ips = ips.sort_by { |ip| ip.split(".").map(&:to_i) }
Run Code Online (Sandbox Code Playgroud)
能否请你详细解释一下
你无法比较包含数字的字符串:"2" > "1"
,是的,但"11" < "2"
因为字符串按字典顺序进行比较,就像字典中的单词一样.因此,必须将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
映射定义的顺序对其进行排序".
归档时间: |
|
查看次数: |
731 次 |
最近记录: |