配列を並び替えてみよう

配列を並び替えて使いこなそう

学習の目標

本章では、以下の内容を学習します。

  • 配列の要素を昇順(小さい順)に並び替える方法を理解する
  • 配列の要素を降順(大きい順)に並び替える方法を習得する
  • 文字列の配列を並び替える方法を学ぶ
  • 独自の基準で配列を並び替える方法を習得する
  • 配列の並び替えを実用的な場面で活用する方法を学ぶ

はじめに

データを扱っていると、情報を特定の順序で並べたい場面がよくあります。例えば、名前を五十音順に表示したり、点数の高い順に生徒を並べたり、日付順にイベントを表示したりすることがあるでしょう。

Rubyでは、配列の要素を簡単に並び替えるための便利なメソッドがいくつか用意されています。これらのメソッドを使いこなせるようになれば、データを整理して見やすく、扱いやすくすることができます。

それでは、具体的な例を見ながら配列の並び替え方法を一緒に学んでいきましょう。

基本的な並び替え方法

昇順(小さい順)に並び替える

まずは、配列の要素を小さい順(昇順)に並び替える基本的な方法から見ていきましょう。Rubyでは、sortメソッドを使うことで簡単に昇順で並び替えができます。

VS Codeでsort_array.rbというファイルを作成し、以下のコードを入力してみましょう。

numbers = [3, 1, 4, 5, 2]
# 昇順(小さい順)に並び替え
sorted_numbers = numbers.sort
puts "元の配列: #{numbers}"
puts "昇順に並び替えた配列: #{sorted_numbers}"

このプログラムを実行すると、以下のような結果が表示されます。

元の配列: [3, 1, 4, 5, 2]
昇順に並び替えた配列: [1, 2, 3, 4, 5]

sortメソッドは、配列の要素を昇順(小さい順)に並び替えた新しい配列を返します。元の配列はそのまま変更されないので、元のデータを保持したまま並び替えた結果を得ることができます。

元の配列を変更して並び替える

もし元の配列自体を並び替えたい場合は、sort!メソッド(末尾に!が付いています)を使用します。

numbers = [3, 1, 4, 5, 2]
puts "並び替え前: #{numbers}"
# 元の配列を昇順に並び替え
numbers.sort!
puts "並び替え後: #{numbers}"

実行結果は以下のようになります。

並び替え前: [3, 1, 4, 5, 2]
並び替え後: [1, 2, 3, 4, 5]

Rubyでは、メソッド名の末尾に!(エクスクラメーションマーク)が付いているメソッドは、元のデータを直接変更することが多いです。これを「破壊的メソッド」と呼びます。使い方によって使い分けるとよいでしょう。

逆順に並び替える

配列の要素を逆順にするには、reverseメソッドを使います。

numbers = [3, 1, 4, 5, 2]
# 配列を逆順にする
reversed_numbers = numbers.reverse
puts "元の配列: #{numbers}"
puts "逆順にした配列: #{reversed_numbers}"

実行結果は以下のようになります。

元の配列: [3, 1, 4, 5, 2]
逆順にした配列: [2, 5, 4, 1, 3]

reverseメソッドは、配列の要素の順序を前後逆にするだけで、大小関係に基づいた並び替えではありません。そのため、上の例では単に配列の最後の要素が最初に、最初の要素が最後になっています。

文字列の配列を並び替える

数値だけでなく、文字列の配列も同様に並び替えることができます。日本語の文字列の場合は、五十音順で並び替えられます。

fruits = ["バナナ", "りんご", "オレンジ", "ぶどう", "メロン"]
# 文字列の配列を五十音順に並び替え
sorted_fruits = fruits.sort
puts "元の配列: #{fruits}"
puts "五十音順に並び替えた配列: #{sorted_fruits}"

実行結果は以下のようになります。

元の配列: ["バナナ", "りんご", "オレンジ", "ぶどう", "メロン"]
五十音順に並び替えた配列: ["うどん", "オレンジ", "バナナ", "ぶどう", "メロン", "りんご"]

日本語の文字列は、一般的に「あいうえお」の順(五十音順)で並び替えられますが、ひらがなとカタカナや漢字が混在する場合は、文字コードの順序によって並び替えられます。そのため、見た目では少し不自然な順序になることもあります。

降順(大きい順)に並び替える方法

要素を大きい順(降順)に並び替えたい場合は、どうすればよいでしょうか。Rubyでは、sortメソッドで昇順に並び替えた後、reverseメソッドで順序を逆にするという組み合わせがよく使われます。

numbers = [3, 1, 4, 5, 2]
# 降順(大きい順)に並び替え
desc_sorted = numbers.sort.reverse
puts "元の配列: #{numbers}"
puts "降順に並び替えた配列: #{desc_sorted}"

実行結果は以下のようになります。

元の配列: [3, 1, 4, 5, 2]
降順に並び替えた配列: [5, 4, 3, 2, 1]

この例では、まずsortメソッドで昇順に並び替え、その結果に対してreverseメソッドを適用して順序を逆にしています。このように、メソッドを連鎖させて呼び出すことを「メソッドチェーン」と呼びます。

独自の基準で並び替える方法

sort_byメソッドの使い方

実際のアプリケーション開発では、単純な昇順や降順だけでなく、特定の条件に基づいて並び替えたいことがあります。例えば、生徒の情報を点数順に並び替えたり、商品を価格順に並び替えたりする場合です。

このような場合、sort_byメソッドを使うと便利です。sort_byメソッドを使うと、並び替えの基準を自由に指定できます。

以下の例を見てみましょう。ハッシュの配列を使って、生徒の名前と点数を管理し、点数順に並び替えます。

students = [
{ name: "田中", score: 80 },
{ name: "佐藤", score: 90 },
{ name: "鈴木", score: 70 }
]
# 点数で昇順に並び替え
sorted_by_score = students.sort_by { |student| student[:score] }
puts "点数順(低い順)に並び替え:"
sorted_by_score.each do |student|
puts "#{student[:name]}: #{student[:score]}点"
end
# 点数で降順に並び替え
sorted_by_score_desc = students.sort_by { |student| -student[:score] }
puts "\n点数順(高い順)に並び替え:"
sorted_by_score_desc.each do |student|
puts "#{student[:name]}: #{student[:score]}点"
end

実行結果は以下のようになります。

点数順(低い順)に並び替え:
鈴木: 70点
田中: 80点
佐藤: 90点
点数順(高い順)に並び替え:
佐藤: 90点
田中: 80点
鈴木: 70点

この例では、sort_byメソッドの中でブロックを使っています。ブロック内で配列の各要素(この場合は生徒のハッシュ)を受け取り、その中から並び替えの基準となる値(この場合は:scoreキーの値)を返しています。

降順に並び替えるには、値の前にマイナス記号(-)を付けて、値の正負を逆転させる方法が使われています。これは数値の場合にのみ使える方法です。

複数の条件で並び替える

並び替えの条件が複数ある場合は、配列を返すようにします。この場合、配列の要素が順番に比較され、最初の要素が同じなら次の要素で比較されます。

students = [
{ name: "田中", grade: "A", score: 80 },
{ name: "佐藤", grade: "A", score: 90 },
{ name: "鈴木", grade: "B", score: 70 },
{ name: "山田", grade: "B", score: 85 }
]
# 最初に学年で並び替え、同じ学年なら点数の高い順に並び替え
sorted_complex = students.sort_by { |student| [student[:grade], -student[:score]] }
puts "学年順、同じ学年なら点数の高い順に並び替え:"
sorted_complex.each do |student|
puts "#{student[:name]}: #{student[:grade]}学年, #{student[:score]}点"
end

実行結果は以下のようになります。

学年順、同じ学年なら点数の高い順に並び替え:
佐藤: A学年, 90点
田中: A学年, 80点
山田: B学年, 85点
鈴木: B学年, 70点

この例では、まず:gradeキーの値で並び替え、同じ学年の生徒については:scoreキーの値の負数で並び替えています。負数を使うことで、点数の高い順(降順)に並び替えられます。

まとめ

本章では、Rubyにおける配列の並び替えについて学びました。以下のポイントを理解できたことと思います。

  • sortメソッドを使うと、配列の要素を昇順(小さい順)に並び替えることができる
  • reverseメソッドを使うと、配列の要素の順序を逆にすることができる
  • sortreverseを組み合わせると、降順(大きい順)に並び替えることができる
  • sort_byメソッドを使うと、独自の基準で配列を並び替えることができる
  • 複数の条件で並び替えるには、配列を返すようにブロックを書く

配列の並び替えは、データを整理して表示する際に非常に役立ちます。様々なメソッドを組み合わせることで、データを目的に合わせて柔軟に並び替えることができます。

次回も、Rubyでより効率的にコードを書くための便利な機能を学んでいきましょう。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
配列の便利なメソッドを使いこなそう