我试图用Ruby对这个文本进行排序,但它不起作用.
1,fgff
12,seffdd
2,dssffs
Run Code Online (Sandbox Code Playgroud)
使用:
cat sorting | ruby -ne 'BEGIN{ $x=[]}; $x << $_.chomp.to_s; END { puts $x.sort }'
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
1,fgff
12,seffdd
2,dssffs
Run Code Online (Sandbox Code Playgroud)
我期待这个
1,fgff
2,dssffs
12,seffdd
Run Code Online (Sandbox Code Playgroud)
我如何修复我的代码?
问题是你没有按数字排序,你按字符值排序:
[1, 12, 2].sort # => [1, 2, 12]
%w[1 12 2].sort # => ["1", "12", "2"]
Run Code Online (Sandbox Code Playgroud)
代替:
str = <<EOT
1,fgff
12,seffdd
2,dssffs
EOT
str.lines.sort_by { |l| l.to_i }.join
# => "1,fgff\n" +
# "2,dssffs\n" +
# "12,seffdd\n"
Run Code Online (Sandbox Code Playgroud)
to_i 将返回字符串的整数值,直到第一个非数字:
'1'.to_i # => 1
'1 2'.to_i # => 1
'1,2'.to_i # => 1
'1_2'.to_i # => 12
Run Code Online (Sandbox Code Playgroud)
最后一个成功,因为Ruby像许多其他语言一样,允许使用下划线(_)作为分隔符,类似于我们使用逗号的方式:
1000 # => 1000
1_000 # => 1000
Run Code Online (Sandbox Code Playgroud)
知道:
'1,fgff'.to_i # => 1
'12,seffdd'.to_i # => 12
'2,dssffs'.to_i # => 2
Run Code Online (Sandbox Code Playgroud)
阅读sort和之间的区别也很有用sort_by.在正确的编程情况下,使用合适的加速器可以获得重大加速.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |