複数条件下でソートさせる方法
sort_by
を使うことで簡単に実現できる。
以下の例の場合、まずval2
で昇順ソートした後にval1
で昇順ソートされる。
sorted_array = array.sort_by do |val1,val2|
[val1,val2]
end
また、降順ソートをしたい場合は、-
をつけるだけでいい。
(負の数でソートすれば順番は逆になるため)
sorted_array = array.sort_by do |val1,val2|
[-val1,val2]
end
この例だと、まずval2
で昇順ソートされ、次にval1
で降順ソートされる。
ただし、文字列は降順ソートできない(負の値という概念がないため)
実行結果
[1] pry(main)> array = [[2,"test2"],[1, "test2"], [3, "test1"]]
=> [[2, "test2"], [1, "test2"], [3, "test1"]]
[2] pry(main)> sorted_array = array.sort_by do |id,name|
[2] pry(main)* [id,name]
[2] pry(main)* end
=> [[1, "test2"], [2, "test2"], [3, "test1"]]
[3] pry(main)> sorted_array = array.sort_by do |id,name|
[3] pry(main)* [name,id]
[3] pry(main)* end
=> [[3, "test1"], [1, "test2"], [2, "test2"]]
[4] pry(main)> sorted_array = array.sort_by do |id,name|
[4] pry(main)* [-id,name]
[4] pry(main)* end
=> [[3, "test1"], [2, "test2"], [1, "test2"]]
おまけ
ちなみにsort
を使う方法もあるが、sort_by
の方がわかりやすいかつ高速なため、sort
を使う機会はほとんどない。
以下のリンク先のコードによると、
https://github.com/fastruby/fast-ruby/blob/master/code/enumerable/sort-vs-sort_by.rb
def fastest
ARRAY.sort_by(&:name)
end
def faster
ARRAY.sort_by { |element| element.name }
end
def slow
ARRAY.sort { |a, b| a.name <=> b.name }
end
という順番らしい。
複雑なソートをしない場合でもsort_byを使ったほうがよい。
参考文献
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/sort_by.html
https://github.com/fastruby/fast-ruby/blob/master/code/enumerable/sort-vs-sort_by.rb