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日
Author And Source
この問題について(Ruby 自作クラスの配列をソートする), 我々は、より多くの情報をここで見つけました https://qiita.com/akilax/items/e5870b330f9ffdcf53c8著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .