[#43479] Re: sakuraインターネットのレンタルサーバーでRuby on Railsを動かす方法 — hantani <hantani@...>
西 啓一朗様
5 messages
2007/05/07
[#43494] ブロックとともに呼び出されたsortについて — "Toshiyuki Ogura" <oguradio@...>
小倉です。
12 messages
2007/05/15
[#43502] UTF-8でtrがうまく機能しない — Fujioka <fuj@...>
藤岡です。
5 messages
2007/05/15
[#43508] rubyのテキストについて — 桑江 康公 <ykuwae@...>
はじめまして、桑江といいます。プログラム開発の勉強をはじめたいと考えています。いろいろと調べたのですが、オブジェクト指向を使った開発が現在しりゅうとのことで、Javaを勉強しようと考えていたのですが、rubyという言語もあるということがわかりネットで調べたところこのメーリングリストにたどり着きました。どなたかプログラム開発初心者でもわかりやすい本またはサイトがありましたら教えていただけないでしょうか?ちなみに、私のレベルはHTMLが少しわかる程度です。
8 messages
2007/05/15
[#43526] タートルグラフィック ライブラリ — "ツムジ" <the.little.schemer+ruby@...>
初めまして。ツムジといいます。
1 message
2007/05/17
[#43553] win32oleプログラミングでのメモリリーク — Hidenori Hashizume <hide-tech@...2.ne.jp>
はしづめです。
5 messages
2007/05/21
[#43554] Ruby/Tk:ドラッグによる範囲選択 — 山崎雄介 <y-yamasaki@...>
山崎(ゆ)です。
5 messages
2007/05/22
[#43565] IO.popenと入出力 — MATSUNAGA Ichiro <vikke@...95.to>
松永です。
5 messages
2007/05/25
[ruby-list:43504] Re: ブロックとともに呼び出されたsortについて
From:
"NARUSE, Yui" <naruse@...>
Date:
2007-05-15 07:41:29 UTC
List:
ruby-list #43504
naruse です。
Toshiyuki Ogura さんは書きました:
> ブロックの中で
> a[1] <=> b[1]
> としているので、何かと何かの2つのものを比較しているように見えます。
> このようなとき、sortのレシーバが、キーと値のペアが3組以上あるハッシュ
> や、要素が3個以上ある配列の場合はこの式はどうなるのでしょうか。
3個のうちの、どれか一つがaに、また別のどれかがbに入ります。
例えば、
[1,2,3,4,5].sort{|a,b| p([a,b]); a<=>b}
としてみると、手元では
[1, 3]
[3, 5]
[2, 3]
[4, 3]
[4, 5]
[1, 2]
と出力されました。
このように、2つの要素を何度か比較して、最終的にsortを行っています。
なぜこれで sort ができるのかは、Wikipediaあたりで調べてください。
Rubyではクイックソートが用いられているそうです。
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88
参考までに array.c のソースも、qsort ってのが見えますね。
static VALUE
sort_internal(ary)
VALUE ary;
{
struct ary_sort_data data;
data.ary = ary;
data.ptr = RARRAY(ary)->ptr; data.len = RARRAY(ary)->len;
qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE),
rb_block_given_p()?sort_1:sort_2, &data);
return ary;
}
src/ruby/branches/ruby_1_8/array.c: unmodified: line 1619 of 3065 [52%]
> sortのブロックの中で使われる
> a[1] <=> b[1]
> は、どう理解すれば分かりやすいのでしょうか。
> この場合、難しく考えないで、理屈抜きで、ソートするときは
> a[1] <=> b[1]
> のように書く、と覚えていても差し支えないでしょうか。
{"x" => 1, "y" => 0, "z" => 2}.sort{|a,b| a[1] <=> b[1]}
は
[["x", 1], ["y", 0], ["z", 2]].sort{|a,b| a[1] <=> b[1]}
と書き換えられるわけですが、ここでのa[1], b[1]は、
sortしているarrayの要素 (例えば["x", 1]) の、
2個目の要素 (例えば1) 同士を比較しているわけで、
これはすなわち、元の hash それぞれの key => value の組の、
value 同士を比較している、という意味です。
理屈抜きで覚えると複雑なソートをしたくなった時に困るかと。
--
NARUSE, Yui <naruse@airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA