Rubyでは配列(Array)を操作するのに便利なメソッドをいくつか用意されています。
配列が空かチェックするempty?、最大・最小値を求めるmax/min、配列を並び替えるsortメソッドなど、よく使う関数はご存知の方も多いでしょう。
今回は、普段はあまり使わないけど、知っていると便利なArray#compact、Array#flatten、Arrray#shuffleメソッドを紹介します。
nilを除去するArray#compactメソッド
RubyのArray#compactメソッドは、配列の要素からnilを取り除くメソッドです。
では、さっそくArray#compactメソッドの使い方を見てみましょう。
array = [ "value1", nil, "value2", nil, "value3" ]
## Array#compactメソッド呼び出し前の配列の内容を出力
p array
## Array#compactメソッドを実行
p array.compact
【実行結果】
-------------------------------------
["value1", nil, "value2", nil, "value3"]
["value1", "value2", "value3"]
実行結果を見ても分かるとおり、コードを実行するとnil`が配列から取り除かれているのが分かります。
Array#compact!
エクスクラメーションマーク(!マーク)がついた、Array#compact!メソッドは、自分自身の配列からnilを取り除く破壊的なメソッドです。
array = [ "value1", nil, "value2", nil, "value3" ]
## Array#compact!メソッドで、自分自身の配列からnilを取り除く
p array.compact!
【実行結果】
-----------------------------------
["value1", "value2", "value3"]
「Array#compact!」メソッドの注意点
エクスクラメーションマーク(!マーク)がついた、Array#compact!メソッドの使い方には注意が必要です。
Array#compact!メソッドは、対象の配列にnilが含まれない場合は戻り値がnilになります。
実際にサンプルコードを見てみましょう。
array = [ "value1", "value2", "value3" ]
p array.compact!
p array
【実行結果】
-----------------------------------
nil
["value1", "value2", "value3"]
結果を見ての通り、nilを含まない配列でArray#compact!を実行すると、戻り値がnilになっています。
ただし、配列自体がnilになって壊れるわけではなく、実行結果の2行目のように配列には正しい値が残ります。
Array#compact!を使用する場合は、メソッドの戻り値は使用すると、思わぬバグを産む恐れがあるため、戻り値は使用しないように注意しましょう。
入れ子の配列を平坦にするArray#flattenメソッド
次にArray#flattenの使い方を紹介します。
Array#flattenメソッドは、入れ子になった配列を平坦にするためのメソッドです。
言葉だけでは分かりにくいため、早速サンプルコードを見ていきましょう。
## 入れ子(多次元)になった配列を宣言
array = [1, 2, [3, 4], 5, 6, [7, 8, 9]]
## Array#flattenメソッド呼び出し前の値を出力
p array
## Array#flattenメソッドを呼び出して配列を平坦(1次元)に整形
p array.flatten
【実行結果】
-----------------------------------
[1, 2, [3, 4], 5, 6, [7, 8, 9]]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
上の実行結果のとおり、配列の中に入れ子にした[3, 4]、[7, 8, 9]などの配列が、Array#flattenメソッドを呼ぶことで、平坦(1次元)な配列に変換されているのが分かります。
次のような、深く入れ子になった配列でも、Array#flattenを使用することで平坦な配列に変換することができます。
array = [1, 2, [3, 4, [4.1, 4.2, [4.11, 4.12]]], 5, 6, [7, 8, 9]]
p array.flatten
【実行結果】
-----------------------------------
[1, 2, 3, 4, 4.1, 4.2, 4.11, 4.12, 5, 6, 7, 8, 9]
平坦化する階層数を指定する
Array#flattenメソッドは、引数に平坦化する階層数を指定できます。
引数に階層数を指定すると、指定した階層より下の配列は平坦化されません。
実際にサンプルコードを見てみましょう。
array = [1, 2, [3, 4, [4.1, 4.2, [4.11, 4.12]]], 5, 6, [7, 8, 9]]
p array.flatten(2)
【実行結果】
-----------------------------------
[1, 2, 3, 4, 4.1, 4.2, [4.11, 4.12], 5, 6, 7, 8, 9]
引数に2を指定したため、2階層目までは平坦化されていますが、3階層目からは配列のままとなっていることが分かります。
Array#flatten!
エクスクラメーションマーク(!マーク)がついた、Array#flatten!メソッドは、自分自身の配列を平坦な配列に変更する破壊的メソッドです。
## 入れ子(多次元)になった配列を宣言
array = [1, 2, [3, 4], 5, 6, [7, 8, 9]]
## Array#flatten!メソッドを実行
array.flatten
p array
【実行結果】
-----------------------------------
[1, 2, 3, 4, 5, 6, 7, 8, 9]
配列をシャッフルするArray#shuffleメソッド
3つ目に紹介するのは、配列の中身をランダムにシャッフルするArray#shuffleメソッドです。
さっそくArray#shuffleメソッドの使い方を見てみましょう。
## シャッフルするための配列を用意
array = [1, 2, 3, 4, 5]
## Array#shuffleメソッドを実行
p array.shuffle
【実行結果】
-----------------------------------
[2, 4, 1, 3, 5]
配列の中身がランダムシャッフルされるため、実行するたびに結果が変わりますが、中身が不規則に並び変わっていることが分かります。
Array#shuffle!
エクスクラメーションマーク(!マーク)がついた、Array#shuffle!メソッドは、自分自身の配列をシャッフルする破壊的メソッドです。
array = [1, 2, 3, 4, 5]
## Array#shuffle!メソッドを実行
array.shuffle!
p array
【実行結果】
-----------------------------------
[2, 4, 1, 3, 5]
さいごに
Rubyで配列を操作するメソッドを3つ紹介してきました。
今回紹介したメソッド以外にも、Rubyでは配列を操作するための便利な関数がいくつもあります。
うまく使いこなすことで、自分で組むコード量が減り、かつ見やすいコードを書くことができるようになります。
【関連記事】
▶【Ruby入門】Arrayクラスの使い方と応用例
Array#flattenメソッドの引数を省略すると、すべての階層を再起的に平坦化します。