環境
Ruby3.1.2
やりたいこと
二次元配列(中身は降順に値が入っている配列)を降順ソートしたい。
コード
record_array = [
[100,50,75,50,50].shuffle,
[100,95,50,50,50].shuffle,
[99,95,95,95,95].shuffle,
[101,1,1,1,1].shuffle,
[80,75,75,60,60].shuffle,
[80,75,75,75,75].shuffle,
[75,75,75,75,75].shuffle]
# 降順に並べる
record_array = record_array.map do |row|
row.sort.reverse
end
p record_array.sort.reverse
#=>
[[101, 1, 1, 1, 1], [100, 95, 50, 50, 50], [100, 75, 50, 50, 50], [99, 95, 95, 95, 95], [80, 75, 75, 75, 75], [80, 75, 75, 60, 60], [75, 75, 75, 75, 75]]
具体的な要件
1.
[100,100]
と
[101,0]
では
[101,0]を優先度高くソートしたい。
2.
[100,75]
と
[100,95]
では
[100,95]を優先度高くソートしたい。
3.
1.と2.の組み合わせから
[
[100,50,75,50,50],
[80,75,75,75,0],
[100,95,50,50,50],
[99,95,95,95,95],
[75,75,75,75,75],
[101,1,1,1,1],
[80,75,75,60,60]
]
が
[
[101, 1, 1, 1, 1],
[100, 95, 50, 50, 50],
[100, 75, 50, 50, 50],
[99, 95, 95, 95, 95],
[80, 75, 75, 75, 0],
[80, 75, 75, 60, 60],
[75, 75, 75, 75, 75]]
]
この順にソートされること。
実装内容
配列のインデックス順にソートが必要があるのでは?と思っていましたが、<=>
演算子による配列の比較が
[100,100] <=> [101,0]
#=> -1
[100,50] <=> [100,75]
#=> -1
であり、
リファレンスのEnumerable#sortに
ブロックなしのときは <=> メソッドを要素に対して呼び、その結果をもとにソートします。
と記述があるので前処理に比較する配列の中身を降順ソートしておけばいいだけでした(後はreverseメソッドをかけるぐらい)
注意事項
ただし、
[100] <=> [100,-1]
#=>
-1
参考