新井です。

In message "[ruby-list:28583] Re: field sort"
  on 08 Mar 2001 11:52:37 +0900,
  Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp> wrote:
> 原です。

> 最近ひそかにブームなのが
> 
> def (Split = {}).[](x)
>    super(x) || self[x] = x.split(':')
> end
> puts readlines.sort{|line, line0|  Split[line][2] <=> Split[line0][2]}
> 
> ですが、分かり難い点ではお勧めできません。(^^;

これいいですね。結果をキャッシュするわけですね。
ぜひFAQに追加させてください。(ちょっとわかりやすくしたつもり)


== 7.12 ファイルを時間の新しい順にソートしたいのですが Dir.glob("*").collect{|f| [File.mtime(f), f]}. sort{|a,b| b[0]<=>a[0]}.collect{|e| e[1]} とすると,カレントディレクトリの".",".."以外のファイルを更新時間の 新しい順にソートした配列を返します.更新時間の古い順にソートする なら,sortの後ろのブロックはなしにしても,いいですね. Dir.glob("*").sort{|a,b| File.mtime(b)<=>File.mtime(a)} でもソートすることができますが,比較する度にファイルにアクセスして 更新時間を調べますので,ソートするのに時間がかかります. この問題を解決するもう一つの方法に個々のファイルの更新時間を キャッシュするオブジェクトを用意する方法があります. cache = {} def cache.mtime(x) self[x] ||= File.mtime(x) end Dir.glob("*").sort{|a,b| cache.mtime(b) <=> cache.mtime(a)} cache_mtime = nil