sortについて
Rubyのソート機能について学んだので、 メモ
sort.rb
schools = ["Todai", "Kyodai", "Waseda", "Aichi"]
p schools.sort
#=> 配列の要素がstringの場合はアルファベット順に並べることができる
#["Aichi", "Kyodai", "Todai", "Waseda"]
sort.rb
numbers = [4, 1, 2, 9, 5, 3]
p numbers.sort
#=> integerクラスの場合は文字が小さい順に並べてくれる
#[1, 2, 3, 4, 5, 9]
sort.rb
p numbers.sort.reverse
#=> reverseメソッドを繋げれば、次は大きい順にソートが出来る
#=>[9, 5, 4, 3, 2, 1]
sort_byについて
そしてsort_byだけど、私のようなプログラミング初心者にとってはこれがちょっと曲者だなと思う。
sort.rb
animals = ["mouse", "dog", "hippopotamus", "giraffe"]
p animals.sort_by {|animal| animal.length }
#=>["cat", "mouse", "giraffe", "hippopotamus"]
つまりどういうこと!? 文字数が少ない順に並べてるのはわかったけどさ。
色々調べた結果、個人的には下記のように書くことでかなり理解が進んだ。
sort.rb
a = animals.sort_by do |animal|
animal.length
end
p a
#=> ["dog", "mouse", "giraffe", "hippopotamus"]
animalsに格納されてある各要素に対してlengthメソッドを使い、返り値を集めて、集まった値に対してsortをかけているということだと理解した。 これだとわかりやすい。
sort.rb
test_score = { 'suzuki' => 90, 'sato' => 50, 'kato' => 60, 'wada' => 40 }
p test_score.sort_by {|k, v| k }
#=>[["kato", 60], ["sato", 50], ["suzuki", 90], ["wada", 40]]
test_score = { 'suzuki' => 90, 'sato' => 50, 'kato' => 60, 'wada' => 40 }
p test_score.sort_by {|k, v| v }
#=> [["wada", 40], ["sato", 50], ["kato", 60], ["suzuki", 90]]
ハッシュに対しても使うことが出来る。 kにはキーが入り、vにはバリューが入っている。 ブロックでkと指定すればキーに対してソートをかけて、vとすればバリューに対してソートをかけることができる。