2009-05-28 114 views
0

我正在尝试按升序以最快的方式对大输入进行排序。该代码是这样的:对Ruby数组进行排序

t=gets 
ti=t.to_i 
r=[] 
for i in(0..ti) 
    k=gets 
    r[i]=k.to_i 
end 
r.sort_by{|x| -x.last} 

这是给我一个错误说undefined method 'last' for nil:nilclass <nomethoderror> from tsort.rb: in sort_by from tsort.rb in 'each' from tsort.rb in 'sort_by'

我不知道我错了。

这就是我已经尝试过的排序数组...这是r[]其中有t的所有数字!任何人都可以请帮忙。

我的投入小于10^6!

+5

尝试给你变量名称更多的含义。它有点难以阅读。 – MrHus 2009-05-28 13:39:58

+0

显然你的一些数组元素是零。这很奇怪,因为你明确地在所有参数上调用to_i。甚至nil.to_i是0.你能让我们知道你正在提供哪个输入吗?这与您的生产代码完全相同吗? – molf 2009-05-28 13:56:25

回答

4

我不能重现您的确切错误,我得到undefined method 'last' for n:Fixnum (NoMethodError)。这很有意义,因为您在x上调用last方法,该方法将保存您的Arrayr,全部为Fixnums的值,该方法没有last方法。

r.sort 

sort方法将你的升序Array以便通过默认排序:

如果用替换最后一行它应该工作。

0

尝试Array's上的排序功能,认为它可以满足您的需求。

3

如果要排序从STDIN取整数列表,我建议类似如下:

lines = STDIN.readlines.map { |x| x.strip.to_i }.sort 
puts lines.join(', ') 

这是更清洁,更ruby​​ish和更快(读Enumerable.sort_by的文档,看看为什么sort是一个更好的选择sort_by)。

我也看到你的代码需要一个数字,表示要读取多少行。您可以通过修改上面的示例获得相同的行为,如下所示:

line_count = gets.strip.to_i 
lines = (1..line_count).collect { gets.strip.to_i }.sort 
puts lines.join(', ') 
+0

我想排序特定数量的数字,我将作为输入以便如何使用 lines = STDIN.readlines.map {| x | x.strip.to_i} .sort puts lines.join(',') – Hick 2009-05-28 14:36:30

+0

@mekasperasky:我编辑了我的答案以反映您的要求。 – 2009-05-28 15:52:25