0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Ruby] 二次元配列の降順ソート

Posted at

環境

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

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?