ごとけんです

In message "[ruby-list:26122] sort."
    on 00/11/21, Katsuya Tanaka <tanaka / esd.spr.epson.co.jp> writes:
>オープンしているファイルは
>11 2 --- ............. <- 日付の後ろは任意データ。
>
>-----
>
>IGNORE = %w(. ..);
>
>list = Hash.new(0);
>
>Dir.foreach(Basedir) do |file|
>    next if IGNORE.include? file;
>
>    lfile = open("#{Basedir}/#{file}", "r");
>    list[file] = lfile.read;
>    lfile.close;
>end
>
>list.sort{|f1, f2|  f1[1].to_i <=> f2[1].to_i }.each do |key, line|
>    print line;
>end
>
>-----
>
>sort がうまく行きません。(日付でソートして欲しい)

次のようにすれば良いでしょう。

  list.sort{|f1, f2| 
    m1, d1 = f1.split
    m2, d2 = f1.split
    [m1.to_i, d1.to_i] <=> [m2.to_i, d2.to_i]
  }

ただし、これだと何度もto_iが行われて効率が悪いので次のように
したほうが良さそうです。

  IGNORE = %w(. ..);

  work = Dir.open(Basedir).collect{|fn|
    next if IGNORE.include? fn
    data = open(fn).read || ""
    token, = data.scan(/\A(\d+)\s+(\d+)\s+(.*)/m)
    if token
      m, d, text = token
    else
      raise "Invalid data `#{fn}'"
    end
    [m.to_i, d.to_i, text,
  #    fn, data
    ]
  }
  # list = {}
  # work.each{|_,_,_, fn, data| list[fn] = data }
  work.sort!
  work.each{|i| print i[-1]}

なおコメント行は list が必要ならを活かして下さい。

-- gotoken