如何在ruby表中按数字顺序对文本进行排序

eni*_*gma 1 ruby sorting

我试图用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)

我如何修复我的代码?

the*_*Man 6

问题是你没有按数字排序,你按字符值排序:

[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.在正确的编程情况下,使用合适的加速器可以获得重大加速.

  • 不客气,但不要用评论说谢谢.Mmmkay? (2认同)