我有一个文件,我在数据中读取并放入数组中,因此我可以对它们进行排序:
input.txt中
#75 - Hamilton Ave.
#12A - Long Road
#12B - Long Road
#120 - Curvy Road
我的红宝石:
result = []
file = open("input.txt").each do | line |
result << line
end
puts result.sort_by {|x| x.to_i}.reverse
我想按字符串中的整数值排序。但是订单的出现是:
#12A - Long Road
#12B - Long Road
#120 - Curvy Road
#75 - Hamilton Ave.
而不是:
#12A - Long Road
#12B - Long Road
#75 - Hamilton Ave.
#120 - Curvy Road
在排序时,我应该使用某种正则表达式来评估字符串吗?
答案 0 :(得分:4)
使用像/\d+/
这样的正则表达式从字符串中提取数字,并使用to_i
将其转换为整数,例如:
input.each_line.sort_by {|line| line[/\d+/].to_i }
要在12A
之前保留12B
,请从块中返回一个数组,例如[ line[/\d+/].to_i, line ]
。这样,如果两行具有相同的整数,它将按字母顺序排列这两行。这假定在有问题的数字之前只有#
,并且每行至少有一个数字。
input = <<END
#75 - Hamilton Ave.
#12A - Long Road
#12B - Long Road
#120 - Curvy Road
END
result = input.each_line.sort_by do |line|
[ line[/\d+/].to_i, line ]
end
p result
# => [ "#12A - Long Road\n",
# "#12B - Long Road\n",
# "#75 - Hamilton Ave.\n",
# "#120 - Curvy Road\n" ]
如果你想摆脱map(&:chomp)
s,请在\n
内投掷。{/ p>