Arrays Ruby按字符串中的整数排序数组顺序

Arrays Ruby按字符串中的整数排序数组顺序,arrays,ruby,sorting,Arrays,Ruby,Sorting,我有一个文件,我从中读取值并将其放入数组中,以便对它们进行排序: 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 而不是:

我有一个文件,我从中读取值并将其放入数组中,以便对它们进行排序:

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    
#75 - Hamilton Ave.
#120 - Curvy Road

排序时是否应该使用某种正则表达式来计算字符串

使用诸如
/\d+/
之类的正则表达式从字符串中提取数字,并使用
to_i
将其转换为整数,例如:

input.each_line.sort_by {|line| line[/\d+/].to_i }
要将
12A
保留在
12B
之前,请从块中返回一个数组,例如
[行[/\d+/]到_i,行]
。这样,如果两行具有相同的整数,它将按字母顺序排列这两行。这假设在所讨论的数字之前只有一个
#
,并且每行至少有一个数字

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" ]

input=使用像
/\d+/
这样的正则表达式从字符串中提取数字,并将其转换为整数,例如:

input.each_line.sort_by {|line| line[/\d+/].to_i }
要将
12A
保留在
12B
之前,请从块中返回一个数组,例如
[行[/\d+/]到_i,行]
。这样,如果两行具有相同的整数,它将按字母顺序排列这两行。这假设在所讨论的数字之前只有一个
#
,并且每行至少有一个数字

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" ]

input=每行的第一个字符是“#”吗?如果不是,你应该把它编辑掉<代码>“#123anything”
将始终为零。是的,它是字符串的一部分,然后您需要
结果。按{x | x[1..-1]排序。\u i}。反转
。例如,
“#74-汉密尔顿大街”[1..-1]#=>“74-汉密尔顿大街”
@CarySwoveland这将把12B放在12A之前,没有相反的,相反的将不会按要求的顺序出现
结果。按{x |[x[1..-1]对u进行排序{u i,x]}
,这样完整的字符串就可以用作平局开关。@engineersmnky,起初我没有注意到这一点,也没有注意到错误的
reverse
l。当我注意到乔丹先生发布的这两件事时,他的答案是:“#”是每行的第一个字符吗?如果不是,你应该把它编辑掉<代码>“#123anything”
将始终为零。是的,它是字符串的一部分,然后您需要
结果。按{x | x[1..-1]排序。\u i}。反转
。例如,
“#74-汉密尔顿大街”[1..-1]#=>“74-汉密尔顿大街”
@CarySwoveland这将把12B放在12A之前,没有相反的,相反的将不会按要求的顺序出现
结果。按{x |[x[1..-1]对u进行排序{u i,x]}
,这样完整的字符串就可以用作平局开关。@engineersmnky,起初我没有注意到这一点,也没有注意到错误的
reverse
l。当我注意到这两件事时,乔丹先生已经发布了他的解决方案。这正是我所想的。虽然不是迭代,而是映射,但我只会使用input.split(“\n”)。sort_by…这非常有效@工程师们:你以前的建议也很有效。一种方法比另一种更合理吗?请求将来的参考。。。我将把这个标记为答案,如果我能做到的话,我也会投票给上面的答案。@porterhaus我通常更喜欢
每一行
,因为它只是在这些行上迭代,而不是像
split(“\n”)
那样将它们全部加载到内存中。然而,在这种情况下,这并没有什么区别,因为
sort\u by
无论如何都会将它们加载到内存中。(当您使用
拆分
时,还要注意Windows样式的行尾,即
\r\n
)非常好的解决方案!这正是我所想的。虽然不是迭代,而是映射,但我只会使用input.split(“\n”)。sort_by…这非常有效@工程师们:你以前的建议也很有效。一种方法比另一种更合理吗?请求将来的参考。。。我将把这个标记为答案,如果我能做到的话,我也会投票给上面的答案。@porterhaus我通常更喜欢
每一行
,因为它只是在这些行上迭代,而不是像
split(“\n”)
那样将它们全部加载到内存中。然而,在这种情况下,这并没有什么区别,因为
sort\u by
无论如何都会将它们加载到内存中。(当您使用
拆分
时,还要注意Windows样式的行尾,即
\r\n
)非常好的解决方案!