スクリプト言語で、ソートが手軽にできるのはとてもありがたいです。 「出現回数順」や「アルファベット順」などにソートして出力したいのは普通のことです。 こういうとき Ruby は、処理した結果をソートして出力することが手軽にできます。
配列は「Array クラス」です。
もともと sort メソッドを持っています。
そのため、手軽にソートできてしまいます。
$ irb irb(main):001:0> array = [5, 3, 6, 1, 8, 2, 9, 10, 4, 7] [5, 3, 6, 1, 8, 2, 9, 10, 4, 7] irb(main):002:0> p array.sort [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] nil irb(main):003:0>
ここでは、配列に必要な情報をまとめて入れて、その情報を配列に入れています。 そして配列の中の配列の値でソートを行っています。
$ irb
irb(main):001:0> a = []
[]
irb(main):002:0> a[0] = [2, 1]
[2, 1]
irb(main):003:0> a[1] = [3, 4]
[3, 4]
irb(main):004:0> a[2] = [0, 9]
[0, 9]
irb(main):005:0> p a.sort
[[0, 9], [2, 1], [3, 4]]
nil
irb(main):006:0> p a.sort {|x, y| y[1] <=> x[1]}
[[0, 9], [3, 4], [2, 1]]
nil
irb(main):007:0> p a
[[2, 1], [3, 4], [0, 9]]
nil
irb(main):008:0>
サンプルとしては次のものがあります。
入力したテキストから URL を拾いだして、数え上げています。 ここでは、ハッシュのキーに URL を使用し、その URL の出現回数を数えています。 コメントにしている部分もハッシュのソートを行なっているものです。 エレガントな方法を探して? 修正の繰り返しの結果ですね。
サンプルとして次のものがあります。
#! /usr/local/bin/ruby
# /home/tetsu/src/ruby/intro/w/sort1.rb
# Created: October 28,2001 Sunday 03:26:45
files = Dir.entries('.').collect do |f|
[f, File.stat(f).mtime]
end
files.sort {|a, b|
[b[1], a[0]] <=> [a[1], b[0]]
}.each do |arr|
p arr
end
ここでは、カレントディレクトリにあるファイルを扱っています。
配列に必要な「ファイル名と日付」をまとめて入れて、その情報を配列に入れています(配列の配列をつくっています)。
そして配列の中の配列の値(日付)でソートを行っています。
ソートのキーとしては、日付とファイル名の二つを使っています。
日付は新しいもの順(降順)にしています。
このため、b[1] と a[1] の順にしています。
ファイル名はアルファベット順(昇順)にしています。
このため、a[0] と b[0] の順にしています。