LoginSignup
3
2

More than 5 years have passed since last update.

sortとsort_byを使って配列の要素を並び替える

Posted at

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とすればバリューに対してソートをかけることができる。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2