2009-05-28 7 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'

を言って私にエラーを与えています。

これは配列をソートしようとしています... tのすべての数字を持つr[]です!誰でも助けてもらえますか?

入力が10^6未満です!

+5

より意味のある変数名を指定してください。その読みにくいです。 – MrHus

+0

あなたのArray要素のいくつかは、明らかにnilです。あなたが明示的にすべての引数に対してto_iを呼び出すので、それは奇妙です。 nil.to_iも0です。どの入力を入力しているのか教えてください。これはプロダクションコードとまったく同じですか? – molf

答えて

4

正確なエラーが再現できない場合は、undefined method 'last' for n:Fixnum (NoMethodError)と表示されます。それはメソッドを r(すべてFixnums)の値を保持するxで呼び出すので、意味があります。lastメソッドを持たないメソッドです。デフォルトでは、あなたのArray昇順で順番を並べ替えられます

r.sort 

sort方法:あなたが最後の行を置き換える場合

はそれが動作するはずです。

0

Array'sでソート機能を試してみてください。

3

あなたはSTDINから取られた整数のリストをソートしたい場合は、私は、次のようなものをお勧め:

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

それは(sortがある理由はEnumerable.sort_byのドキュメントを読んで、よりクリーンでruby​​ishと高速です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

+0

@mekasperasky:要件を反映するために私の答えを編集しました。 –