一部の要素がnilになる可能性のある属性に基づいて配列をソートする 質問する

一部の要素がnilになる可能性のある属性に基づいて配列をソートする 質問する

オブジェクトの配列があります

[<#a star=1  val=1>, <#a star=nil val=3> , <#a star=2  val=2>]

配列を時間順にソートし、次に値順にソートする必要があります

[ <#a star=2  val=2>, <#a star=1  val=1>, <#a star=nil val=3> ]

しかし、sort_by を使用すると、時間が nil であるためエラーが発生します。

私は今、醜い方法で並べ替えていますが、もっと良い方法があるはずです

starred=[]
@answers.each {|a| (starred << a) if a.starred }
@answers=@answers-starred
starred=starred.sort_by {|a| a.starred }.reverse
@answers=starred+@answers

ベストアンサー1

starred.sort_by { |a| [a ? 1 : 0, a] }

2 つの要素を比較する必要がある場合、配列を比較します。Ruby が配列を比較する場合 (===メソッドを呼び出す)、1 番目の要素を比較し、1 番目の要素が等しい場合にのみ 2 番目の要素に進みます。1? 1 : 0番目の要素として Fixnum があることが保証されるため、エラーは発生しません。

を実行すると? 0 : 1nilは配列の先頭ではなく末尾に表示されます。
次に例を示します。

irb> [2, 5, 1, nil, 7, 3, nil, nil, 4, 6].sort_by { |i| [i ? 1 : 0, i] }
=> [nil, nil, nil, 1, 2, 3, 4, 5, 6, 7]

irb> [2, 5, 1, nil, 7, 3, nil, nil, 4, 6].sort_by { |i| [i ? 0 : 1, i] }
=> [1, 2, 3, 4, 5, 6, 7, nil, nil, nil]

おすすめ記事