Skip to content

Instantly share code, notes, and snippets.

@10nin
Created December 20, 2018 14:55
Show Gist options
  • Save 10nin/ff608ac4e7ee3ce5d2688bcc8b0f9380 to your computer and use it in GitHub Desktop.
Save 10nin/ff608ac4e7ee3ce5d2688bcc8b0f9380 to your computer and use it in GitHub Desktop.
# 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