• 締切済み

Ruby sortメソッド

RubyのEnemuratableモジュール内で定義されているメソッドのひとつsort メソッドの使い方が良くわかりません。 ブロックや<=>演算子を用いて何か分かりやすい例はありますでしょうか?

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

例をあげますと ary=[17, 5, -4] p ary.sort p ary.sort{|a, b| a <=>b} # これはary.sortと同じです。 a<=>b自体はa==bで0, a<bで-1, a>bで1をとる演算子ですのでブロックの中に同し挙動をする式を入れてやれば良いです。 しかし、この形式はまず使いません。 p ary.sort_by{|a| a} # ary.sortと同じ p ary.sort_by{|a| -a} # 大きい方から並ぶ p ary.sort_by{|a| a%3} # 余の小さい方から並ぶ こちらの方が便利ですし、高速な処理ができます。

関連するQ&A

  • rubyでは比較演算子もメソッドとして書き換えが可

    rubyでは<や>などの比較演算子もメソッドと分類されるのでオーバーライドが可能と認識しております。具体的にどのようにコーディングしたら良いのでしょうか? 例えば、配列に数値が格納されているとします。 array=[3,5,4,2,1] この配列をソートした場合に比較が何回行われたかをカウントしたいです。 p array.sort >や<が再定義可能なら、比較演算子が呼ばれる度にカウンターアップするなどと言う事はできるような気がするのですが、どうコーディングしてよいか解りません。 rubyのマニュアルも読んだし、それなりに検索でも頑張ったのですが、煮詰まってしまいました。 ご指導のほど、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • VBA Sortメソッドについて

    VBA初心者です。 並べ替えをしたくてSortメソッドというのを使っているのですが、 Sortメソッドの後にプログラムを書くと 「実行時エラー'1004':アプリケーション定義またはオブジェクト定義エラーです」 と出てしまいます。 Worksheets(sheets).Range("A1:D30").sort _ Key1:=Range("B2"), _ Header:=xlGuess, _ MatchCase:=True, _ SortMethod:=xlPinYin ↑こんなプログラムを2個続けて(sheetsを変えて)実行させ、 その後にもいろいろ続けて書きたいのですがどうしたらいいのでしょう。 「:=」という書き方を初めて使ったのでよく理解できていません。 ご教授いただけると助かります。

  • Ruby 自作メソッドのブロック付きメソッドについ

    いつも、ご教授ありがとうございます。 Ruby でメソッドを自作してそのメソッドにブロックを持たせる場合 ブロック内で返り値を返すためにはどうしたらいいのでしょうか? たとえば以下のような自作メソッドがあるとすると def blocktest(str) if (block_given?) yield str else print "メソッドにブロックが与えられていない"; end end begin #自作したメソッドにブロックを与えた場合 res = blocktest("ブロック付きメソッドのテスト") {|value| print value; print "<br/>" print "メソッドに与えられた引数をprintしています" return "ブロックで返り値" } print res; print "<hr />" #ブロックを与えない場合 blocktest("ブロック付きメソッドのテスト"); rescue => ex print ex.message end 上記のようにブロック内で返り値 を指定して変数resのその返り値を返したい場合 どうしたらいいのでしょうか? 一応、ブロック内でreturnで値を与えてはいますが、例外が発生します。 よろしくお願いしまう。

    • ベストアンサー
    • Ruby
  • Rubyのtimesメソッドから抜けたい

    Rubyの初心者です。 timesメソッドの中にif文を入れて,もし条件を満たしていれば timesメソッドから抜けたいのですが,どうすればいいのでしょうか。 if文の中でbreakしてもtimesメソッドからは抜けられなかったので質問しました。 どうかよろしくお願いします。

  • EXCEL VBA----Sortメソッド

    こんにちは。 また1つ教えて下さいませ! Sortメソッドを使った並べ替えで 並べ替えのキーは最高3つまでだと思うのですが どうしてもキーを6つ持たせて並べ替えをしたいのです。 方法はSortメソッドにはこだわっていません。(それしか知らないだけなので) 何か良い方法がありましたら、お教え下さい。 よろしくお願いします。

  • 2回目のSortメソッドが失敗~2007~

    Office2007エクセルでの質問です。 Office2003だと正常に動作します。 標準モジュールに作ったマクロなんですが。 (1)他エクセルファイル(複数)を開いて、情報を取得。閉じる。 (2)一度、自分の一覧用シートに貼り付ける。 (3)ソートをかける。 (4)参照したりなんだりでデータを集計する。 (5)結果表示用シートに表示する。 エクセル起動後、一度目の実行は問題なく終了します。 ブックを閉じずに、再度実行すると、結果はまったく同じになるはずなのに、(3)のソートで ・実行時エラー'-2147417848(80010108)'  'Sort'メソッドは失敗しました'Range' ・実行時エラー'1004'  'Sort'メソッドは失敗しました'Range' のいずれかが発生します。 また、対象のRangeを一度取得し、オブジェクトに対してSortをかけようとすると、 実行時エラー'-2147417848(80010108)' オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。 が発生します。 考えられる、予想される原因としてはどんなものがあるでしょうか? かなり困り、急いでいます。 ソースも載せないで(あまりにも長いので・・)、なんですが、よろしくお願いいたします。

  • Rubyで配列をソートする

    15(tab)5634(改行) 24(tab)4446(改行) 24(tab)8357(改行) 24(tab)3287(改行) 56(tab)5465(改行) 56(tab)1324(改行) 56(tab)7544(改行) 上記のように1行にtabで区切られた2つの数値が並んでいるテキストファイルがあります。 このファイルを、Rubyを使って1列目が同じ数字の行ごとにソートしたいのですが、できなくて困っています。 上の例でしたら、1列目が24の3行を2列目の数値をキーとしてソート、1列目が56の3行を2列目の数値をキーとしてソートするということです。 一行ずつ読み込んで、array = line.split(/\t/)でタブでくぎって配列に格納するスクリプトを書いていたのですが、どうしてもできないので、力を貸していただけないでしょうか。 よろしくお願いします。

  • ruby 1.8.7 で、多次元配列をソートする

    ruby 1.8.7 で、下記のような配列をソートしたいんですが、どう記述したら良いでしょうか。 x = [[1, 1], [2, 2], [11, 10], ・・・ [1, 13], [2, 14]] ..........a b a = 1番目の ソート 順 b = 2番目の ソート 順       よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Rubyのcloneメソッドの使い方を教えてください。

    Rubyのcloneメソッドの使い方を教えてください。 str=”tora" str2 = str.clone str= "usagi" str2 #=>"usagi" だと思っていたのですが、違うようです。 よろしくお願いいたします。

  • ブロックつきメソッドやyield文の用途について

    こんにちは。 漠然とした質問なのですがご教示ください。 プログラミング初心者で、 現在、「楽しいRuby」と「プログラミング言語Ruby」を読みながら 勉強をしています。 そのなかで「ブロックつきメソッド」や「yield文」の用途についての 疑問が出てきました。 疑問というのは、  「わざわざ、『ブロックを引数として自作メソッドに与える』  ことの利点ってなに?」 ..です。 私としては、  自作メソッドを呼び出した後、その中のyield文で  再度メソッドの外(自作メソッドの呼び出し元)に制御を戻すんだったら、  自作メソッドの中にブロック処理の内容を書いておくか、  または、最初から自作メソッドを呼ばずにブロック処理をするほうが、  処理の流れがわかりやすくてよいのでは??? ..と感じています。 大規模なプログラムを複数の人で作るような場合にはこのようなしくみが あったほうが便利.. ということなんでしょうか? ちなみに私は主に テキストファイルの編集や比較、結合..などの目的で Rubyプログラムを作っていて、規模はせいぜい100~200行くらいです。 他のRubyプログラムとの連携もありません。 「そんな使い方なら、利点はないよ」というご回答でも構いません。 具体例などと併せてご教示ください。 よろしくお願いいたします。

    • ベストアンサー
    • Ruby