Created
December 20, 2018 14:55
-
-
Save 10nin/ff608ac4e7ee3ce5d2688bcc8b0f9380 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# nilの混じった配列 | |
ary = [1,2,3,nil,4,5,6,nil,7,8,9].shuffle | |
## => [2, 6, 3, nil, 4, nil, 5, 1, 8, 9, 7] | |
# 普通に、例えばto_iしてソートすると、nil.to_iは0なので頭の方に固まっちゃう | |
ary.sort_by {|n| n.to_i} | |
## => [nil, nil, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
# なので、nilの場合にはINFINITYとして扱うようにしてやると、後ろに固められる | |
ary.sort_by{ |i| i || Float::INFINITY} | |
## => [1, 2, 3, 4, 5, 6, 7, 8, 9, nil, nil] | |
# 具体的にどんなシーンで使うか? | |
# 元データがあって(例えばDBから引き出してきたID列) | |
# これにユーザから元データと新規データの組み合わせが投げ込まれた時 | |
# 元データに存在していれば昇順に並べていって、存在していなければ出てきた順に後ろに寄せとくみたいな処理の場合 | |
# この方法でnilを後ろ側に寄せておくことができる | |
base_data = [10, 20, 30, 40, 50, 60, 70, 80, 90] | |
new_datas = ['80', '10', '50', '75', '90', '95', '30'] | |
new_datas.sort_by { |n| base_data.index(n.to_i) || Float::INFINITY} | |
## => ["10", "30", "50", "80", "90", "75", "95"] | |
# じゃあ、文字列配列だった場合にはどうするんだろう? | |
# 上記のように外側にindex配列をもたせる以外の方法で、nilを簡単に後方に固められるんだろうか? | |
s_ary = ["ham", nil, "spam", "egg"] | |
## => ??? how do it sort, and nil value pull over to the tail ??? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment