【Ruby】レッスン4-04:配列を並び替えよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:配列の並び替え

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、メソッド(レッスン1~3)配列の基本配列の操作配列の調査配列の並び替えeachメソッドmapメソッドfilterメソッドハッシュ

<<前のページ Ruby記事一覧 次のページ>>

Rubyの「配列の並び替え」とは

この章ではRubyにおける「配列の並び替え」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。

プログラミングで配列の並び替えは非常に重要な操作の一つです。

例えばユーザーからの入力を昇順に並び替えたり、データをランダムに表示したりする場面があります。

本記事ではRubyで配列を並び替える方法を「昇順・降順ソート」「逆順並び替え」「ランダム並び替え」に分けて解説します。

それぞれの方法を理解して配列操作の幅を広げましょう。

昇順・降順ソート

Rubyではsortメソッドを使うと、配列を昇順に並び替えることができます。

以下は基本的な使用例です。

arr = [3, 1, 4, 1, 5]
sorted_arr = arr.sort
p sorted_arr # => [1, 1, 3, 4, 5]

ここで重要なのは、sortは元の配列を変更しない「非破壊的メソッド」である点です。

元の配列を変更したい場合はsort!を使用します。

arr.sort!
p arr # => [1, 1, 3, 4, 5]

降順にソートしたい場合は、ブロックを使ってsortに条件を指定します。

desc_arr = arr.sort { |a, b| b <=> a }
p desc_arr # => [5, 4, 3, 1, 1]

※ブロックについてはLesson4-10で詳細に解説します。

逆順並び替え

配列を逆順に並び替えるにはreverseメソッドを使用します。

reversesortと同じく非破壊的メソッドで、元の配列はそのままに新しい配列を作成します。

arr = [1, 2, 3]
reversed_arr = arr.reverse
p reversed_arr # => [3, 2, 1]
p arr          # => [1, 2, 3]

元の配列を逆順に変更したい場合はreverse!を使います。

arr.reverse!
p arr # => [3, 2, 1]

ランダム並び替え

データをランダムな順序に並び替えたい場合はshuffleメソッドを使います。

これもsortreverseと同様に非破壊的です。

arr = [1, 2, 3, 4, 5]
shuffled_arr = arr.shuffle
p shuffled_arr # => ランダムな順序
p arr          # => [1, 2, 3, 4, 5]

破壊的に並び替えるにはshuffle!を使用します。

arr.shuffle!
p arr # => ランダムな順序

注意点

「破壊的メソッド」と「非破壊的メソッド」の違いを理解しておくことが重要です。

  • 非破壊的メソッド:元の配列は変更されず、新しい配列を返します(例:sortreverseshuffle)。
  • 破壊的メソッド:元の配列そのものを変更します(例:sort!reverse!shuffle!)。

コードを書く際には必要に応じて使い分けましょう。

破壊的メソッドを不注意に使うと、思わぬバグの原因になることがあります。

まとめ

今回学んだポイントを振り返りましょう:

  • 配列の並び替え方法には「昇順・降順ソート」「逆順並び替え」「ランダム並び替え」がある。
  • メソッドには「非破壊的メソッド」と「破壊的メソッド」があり、用途によって使い分ける必要がある。

配列の並び替えの練習問題

Rubyを使って配列の並び替えやランダム化を学ぶプログラムを作成してみましょう。

プログラムではランダムな整数を持つ配列を作成し、それを昇順、降順に並び替えたり、シャッフルしたりします。

また、元の配列を変更する方法と変更しない方法についても理解を深めます。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • ランダムな数値(1〜100)を10個生成して配列に格納すること。
  • 生成された配列を昇順に並び替え、結果を表示すること。
  • 同じ配列を降順に並び替え、結果を表示すること。
  • 配列をランダムに並び替えた結果を表示すること(シャッフル)。
  • 元の配列が変更されていないことを確認し、結果を表示すること。
  • 配列を昇順に並び替える際に破壊的変更を行い、その結果を表示すること。
  • 配列をランダムに並び替える際に破壊的変更を行い、その結果を表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

ランダムな整数の配列を作成します。
作成された配列: [32, 87, 45, 65, 12, 56, 23, 98, 75, 34]
昇順に並び替えた配列: [12, 23, 32, 34, 45, 56, 65, 75, 87, 98]
降順に並び替えた配列: [98, 87, 75, 65, 56, 45, 34, 32, 23, 12]
ランダムに並び替えた配列: [56, 98, 12, 32, 87, 23, 75, 45, 65, 34]
元の配列(変更されていない): [32, 87, 45, 65, 12, 56, 23, 98, 75, 34]
元の配列を昇順に並び替えた場合(破壊的変更): [12, 23, 32, 34, 45, 56, 65, 75, 87, 98]
元の配列をランダムに並び替えた場合(破壊的変更): [56, 75, 32, 87, 12, 23, 98, 45, 65, 34]

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:「ランダムな整数の配列を作成します。」と出力
2:配列numbersを1から100までのランダムな整数10個で初期化
3:「作成された配列: 」と配列numbersの内容を出力
4:配列numbersを昇順に並び替えた結果を変数sorted_numbersに代入
5:「昇順に並び替えた配列: 」と配列sorted_numbersの内容を出力
6:配列numbersを降順に並び替えた結果を変数reversed_numbersに代入
7:「降順に並び替えた配列: 」と配列reversed_numbersの内容を出力
8:配列numbersをランダムに並び替えた結果を変数shuffled_numbersに代入
9:「ランダムに並び替えた配列: 」と配列shuffled_numbersの内容を出力
10:「元の配列(変更されていない): 」と配列numbersの内容を出力
11:配列numbersを昇順に並び替える(破壊的変更)
12:「元の配列を昇順に並び替えた場合(破壊的変更): 」と配列numbersの内容を出力
13:配列numbersをランダムに並び替える(破壊的変更)
14:「元の配列をランダムに並び替えた場合(破壊的変更): 」と配列numbersの内容を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# ランダムな整数を生成し、配列を作成します
puts "ランダムな整数の配列を作成します。"
=begin
【穴埋め問題1】
ここで配列を生成し、1から100までのランダムな数値を10個含む配列numbersを作成してください。
=end
puts "作成された配列: #{numbers}"

# 配列を昇順に並び替えます
=begin
【穴埋め問題2】
ここで配列numbersを昇順に並び替えた結果を変数sorted_numbersに代入してください。
=end
puts "昇順に並び替えた配列: #{sorted_numbers}"

# 配列を降順に並び替えます
=begin
【穴埋め問題3】
ここで配列numbersを降順に並び替えた結果を変数reversed_numbersに代入してください。
=end
puts "降順に並び替えた配列: #{reversed_numbers}"

# 配列をシャッフルします
=begin
【穴埋め問題4】
ここで配列numbersをランダムに並び替えた結果を変数shuffled_numbersに代入してください。
=end
puts "ランダムに並び替えた配列: #{shuffled_numbers}"

# 元の配列は変更されていないことを確認します
puts "元の配列(変更されていない): #{numbers}"

# 破壊的な変更の例
=begin
【穴埋め問題5】
ここで配列numbersを昇順に並び替える破壊的な変更を行ってください。
=end
puts "元の配列を昇順に並び替えた場合(破壊的変更): #{numbers}"

=begin
【穴埋め問題6】
ここで配列numbersをランダムに並び替える破壊的な変更を行ってください。
=end
puts "元の配列をランダムに並び替えた場合(破壊的変更): #{numbers}"

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

# ランダムな整数を生成し、配列を作成します
puts "ランダムな整数の配列を作成します。"
numbers = Array.new(10) { rand(1..100) } # 1から100までのランダムな数値を10個生成
puts "作成された配列: #{numbers}"

# 配列を昇順に並び替えます
sorted_numbers = numbers.sort
puts "昇順に並び替えた配列: #{sorted_numbers}"

# 配列を降順に並び替えます
reversed_numbers = numbers.sort.reverse
puts "降順に並び替えた配列: #{reversed_numbers}"

# 配列をシャッフルします
shuffled_numbers = numbers.shuffle
puts "ランダムに並び替えた配列: #{shuffled_numbers}"

# 元の配列は変更されていないことを確認します
puts "元の配列(変更されていない): #{numbers}"

# 破壊的な変更の例
numbers.sort!
puts "元の配列を昇順に並び替えた場合(破壊的変更): #{numbers}"

numbers.shuffle!
puts "元の配列をランダムに並び替えた場合(破壊的変更): #{numbers}"

正解コードの解説

今回のコードはランダムな整数の配列を生成し、その配列を並び替えたりシャッフルしたりする方法を学ぶものです。

コードをブロックごとに分けて詳しく解説します。

ランダムな整数を生成し、配列を作成する部分

puts "ランダムな整数の配列を作成します。"
numbers = Array.new(10) { rand(1..100) }
puts "作成された配列: #{numbers}"
  • puts: コンソールに文字列を表示するためのメソッドです。ここでは「ランダムな整数の配列を作成します。」というメッセージを表示します。
  • Array.new(10) { rand(1..100) }: 長さ10の配列を生成し、各要素には1から100までのランダムな整数を格納します。
  • rand(1..100): 指定した範囲(1から100)のランダムな整数を生成するメソッドです。
  • 最後に、生成された配列をputsで表示します。

配列を昇順に並び替える部分

sorted_numbers = numbers.sort
puts "昇順に並び替えた配列: #{sorted_numbers}"
  • numbers.sort: 配列の要素を昇順(小さい順)に並び替えた新しい配列を生成します。
    この操作は元の配列には影響を与えません。
  • 重要ポイント: この部分は元の配列numbersを変更せず、新しい配列sorted_numbersに並び替えられた結果を保存します。

配列を降順に並び替える部分

reversed_numbers = numbers.sort.reverse
puts "降順に並び替えた配列: #{reversed_numbers}"

numbers.sort.reverse: まずnumbers.sortで昇順に並び替え、その結果をreverseメソッドで逆順にします。

これにより降順の配列を生成します。

配列をランダムに並び替える部分

shuffled_numbers = numbers.shuffle
puts "ランダムに並び替えた配列: #{shuffled_numbers}"

numbers.shuffle: 配列の要素をランダムな順序で並び替えた新しい配列を生成します。

この操作も元の配列には影響を与えません。

元の配列が変更されていないことを確認する部分

puts "元の配列(変更されていない): #{numbers}"

配列の並び替え操作(sortshuffle)が元の配列numbersに影響を与えていないことを確認するための出力です。

配列を破壊的に変更する部分

numbers.sort!
puts "元の配列を昇順に並び替えた場合(破壊的変更): #{numbers}"

numbers.shuffle!
puts "元の配列をランダムに並び替えた場合(破壊的変更): #{numbers}"
  1. sort!shuffle!: 配列を破壊的に変更するメソッドです。
    • sort!: 元の配列自体を昇順に並び替えます。
    • shuffle!: 元の配列自体をランダムな順序に並び替えます。
  2. 破壊的変更を行う場合、元の配列は元の順序を保持しません。

まとめ

このコードではRubyの配列操作に関する以下の重要なポイントを学ぶことができます。

  • 配列の生成とランダムな値の設定(Array.newrand)。
  • 配列の並び替え(sortreverse)。
  • 元の配列を変更しない非破壊的な操作と、元の配列を変更する破壊的な操作(sort!shuffle!の違い)。
  • 配列のシャッフル(shuffle)。

特に「配列の並び替え」に関する操作は、データ処理やアルゴリズムの基本となる重要な知識です。

このコードを理解し応用することで、Rubyプログラミングの基礎をより深く学ぶことができるでしょう。

ぜひ自分でコードを書いて試してみてください!

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Rubyのテキスト&問題集トップへ戻る
    トップページへ戻る