Rubyで2次元配列をソートする
簡単にですがまとめました。
やりたいこと
商品毎の商品番号, 商品名, 価格を持った下のような2次元配列に対して、価格順または商品名順のソートを行いたい。
shohin = [[1, "carrot", 88], [2, "tomato", 120], [3, "apple", 210], [4, "orange", 105]]
2次元配列をソートする例
上のshohin配列を使ってソートを行う。
sorted = shohin.sort {|a, b| a[2] <=> b[2] # 価格ソート } p sorted # ソート結果 # [[1, "carrot", 88], # [4, "orange", 105], # [2, "tomato", 120], # [3, "apple", 210]] sorted = shohin.sort {|a, b| a[1] <=> b[1] # 商品名ソート } p sorted # ソート結果 #[[3, "apple", 210], # [1, "carrot", 88], # [4, "orange", 105], # [2, "tomato", 120]]
- sort処理時にa, bにshohin配列の商品毎のデータが渡される。
- a[x] <=> b[x] でx列目の要素(商品番号 or 商品名 or 価格)の比較を行い、並べ替えを実施する。
- 並べ替えた配列はsortedに格納される。
参考
以下のページを参考にしました。
Rubyでオブジェクトを要素とする配列をソートする際の覚え。 - Dragonmasterの日記
今回は2次元配列で無理やりソートしましたが、きれいに書くならオブジェクトや、構造体で「商品」を作成し、配列で管理した方がすっきりまとまります。