Ruby で nil が含まれている配列をソートする
さて、Ruby の配列でソートを行いたい場合、配列内に nil
があるとうまくソートできないことがあります。
ary = ["homu", nil, "mado", nil, nil, "mami", "saya", nil] # Error: comparison of String with nil failed (ArgumentError) ary.sort
これは、『nil
とその他の要素が比較できない』のでエラーになっています。
nil
とそうでない要素を分けてソートする
こういう場合は Enumerable#partition
を利用して『nil
』と『それ以外』を分けてからソートするといい感じにできそうです。
ary = ["homu", nil, "mado", nil, nil, "mami", "saya", nil] # #partition で nil とそうでない要素を分けてからソートする p ary.partition(&:nil?).yield_self { |nils, ary| # nil は末尾に持っていく ary.sort + nils } # => ["homu", "mado", "mami", "saya", nil, nil, nil, nil]
これでだいぶスッキリとソートすることが出来ますね。
今回は #nil?
を使って分けましたが、他にも present?
や blank?
や hoge?
みたいなメソッドを利用してもいい感じにソートが制御できそうです。