Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 21081

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

$
0
0

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

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

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

自作のクラス

user.rb
classUserattr_accessor:name,:age,:heightdefinitialize(name,age,height)@name=name@age=age@height=heightendenduser1=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}#昇順pusers.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人前のエンジニアになるまであと93日


Viewing all articles
Browse latest Browse all 21081

Trending Articles