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次元配列で無理やりソートしましたが、きれいに書くならオブジェクトや、構造体で「商品」を作成し、配列で管理した方がすっきりまとまります。