Ruby 自作クラスの配列をソートする


Ruby 自作クラスの配列をソートする

100日後に1人前になる新人エンジニア(8日目)です

あれ自作したクラスの入った配列ってどうやってソートするんだっけ...
って今日ちょっと詰まってしまったのでメモとして残しておきます。

自作のクラス

user.rb
class User
  attr_accessor :name, :age, :height

  def initialize(name, age, height)
    @name = name
    @age = age
    @height = height
  end
end

user1 = User.new("foo", 15, 190)
user2 = User.new("bar", 80, 150)
user3 = User.new("baz", 28, 168)
users = [user1, user2, user3]

こんな感じで自作のユーザークラスを作りそれらをusersという配列に入れる
このusersの並べ替えについて今日は考える

とりあえずソートしてみる

ruby.rb
users.sort
#エラーが発生
#`sort': comparison of User with User failed (ArgumentError)

上のように怒られます。
Userを比較することに失敗しました。
オブジェクトそのままの比較はできないですね。

ということでオブジェクトの属性で比較します。
そのためにはsortメソッドではなくsort_byを使います
年齢で比較する

ruby.rb
users = users.sort_by{|user|user.age}  #昇順
p users.map{|user|"#{user.name},#{user.age},#{user.height}"}
#出力["foo,15,190", "baz,28,168", "bar,80,150"]

users = users.sort_by{|user|user.age}.reverse  #降順
#出力["bar,80,150", "baz,28,168", "foo,15,190"]

こんな感じで自作クラスの属性ごとにソートすることができました。
降順にしたいときはreverseメソッドを使えば簡潔になります。
またsort_byメソッドももっと簡単にかけるので、

ruby.rb
users = users.sort_by(&:height)

この一行でusersの配列に入ったuserを身長昇順に並び替えられます。
Rubyてすごいよね。

本日はここまでです。
みてくださった方ありがとうございました。

1人前のエンジニアになるまであと92日