Rubyの配列、ハッシュテーブルを表現するArray、Hashクラスの使い方若手エンジニア/初心者のためのRuby 2.1入門(3)(3/4 ページ)

» 2014年05月08日 18時00分 公開
[著:麻田優真、監修:山根剛司株式会社アジャイルウェア]

オブジェクトの選択に関連するArrayのメソッド

Array#sampleで配列から1要素をランダムに選び出す

 Array#sampleを使うと、引数に指定した個数、配列からランダムに選び出されたオブジェクトの配列を得ることができます。乱数を使っているので、以下の実行結果は毎回変わります。

[1] pry(main)> [1, 2, 3, 4, 5].sample(2)
=> [1, 3]

Array#index、Array#rindexで配列内を検索する

 Array#indexやArray#rindexを使うと配列内を検索できます。Array#indexは、前から順に検索して最初に見つかった要素の位置を表すインデックスを返します。Array#rindexは後ろから順に検索して最初に見つかった要素の位置を表すインデックスを返します。

[1] pry(main)> array = [1, 2, 3, 3, 4, 5, 6]
=> [1, 2, 3, 3, 4, 5, 6]
[2] pry(main)> array.index(3)
=> 2
[3] pry(main)> array.rindex(3)
=> 3
[4] pry(main)> array.index(10)
=> nil

 [1]で配列arrayを初期化し、[2]と[3]で3という整数を検索しています。[2]では、Array#indexは前から順に検索するので、ここではインデックスが2にあたる整数3がヒットし、そのインデックスが戻り値となっています。

 [3]では、Array#rindexは後ろから順に検索するので、インデックスが3にあたる整数3がヒットし、そのインデックスが戻り値となっています。また、該当する要素がない場合は、[4]のようにnilが返ります。

オブジェクトの整形に関連するArrayのメソッド

Array#uniq、Array#uniq!で重複する要素を取り除く

 Array#uniqを使うと、配列から重複する要素を取り除くことができます。Array#uniq!はArray#uniqの破壊的メソッド版です。

[1] pry(main)> [1, 1, 2, 2, 3, 3, 3].uniq
=> [1, 2, 3]
[2] pry(main)> [1, 2, 3, 4].uniq
=> [1, 2, 3, 4]
[3] pry(main)> [1, 2, 3, 4].uniq!
=> nil

 [1]を見ると分かるように、Array#uniqを使うことで重複する要素が取り除かれていることが分かります。また、[2]と[3]を見ると分かるように、取り除かれる要素がない場合、Array#uniqとArray#uniq!では戻り値が異なっています。Array#uniq!は、取り除かれる要素がない場合はnilを返します。

Array#compactとArray#compact!でnilを取り除く

 Array#compactを使うと、配列からnilを取り除くことができます。Array#compact!はArray#compactの破壊的メソッド版です。

[1] pry(main)> ["alice", "in", nil, "wonderland", nil].compact
=> ["alice", "in", "wonderland"]
[2] pry(main)> ["alice", "in", "wonderland"].compact
=> ["alice", "in", "wonderland"]
[3] pry(main)> ["alice", "in", "wonderland"].compact!
=> nil

 [1]を見ると分かるように、Array#compactを使うと配列に含まれるnilを取り除いたものを得ることができます。また、[2]と[3]を見ると分かるように、nilが含まれていない配列ではArray#compactとArray#compact!の戻り値が異なっています。Array#compact!は、nilが含まれていない配列に対してはnilを返します。

Array#concatで配列を連結する

 Array#concatを使うと、別のArrayオブジェクトを連結できます。

[1] pry(main)> array1 = ["queen", "of"]
=> ["queen", "of"]
[2] pry(main)> array2 = ["hearts"]
=> ["hearts"]
[3] pry(main)> array1.concat(array2)
=> ["queen", "of", "hearts"]
[4] pry(main)> array1
=> ["queen", "of", "hearts"]

 この例では、[1]と[2]でarray1、array2を初期化し、[3]でarray1にarray2を連結しています。

Array#zipで「配列の配列」(2次元配列)を作る

 Array#zipは、このメソッドを実行した配列と、引数に与えた配列を組み合わせた「配列の配列」(2次元配列)を返すメソッドです。少し説明が難しいので、以下の例を見てください。

[1] pry(main)> array1 = [:a, :b, :c]
=> [:a, :b, :c]
[2] pry(main)> array2 = [:x, :y]
=> [:x, :y]
[3] pry(main)> array3 = [:p, :q, :r, :s]
=> [:p, :q, :r, :s]
[4] pry(main)> array1.zip(array2, array3)
=> [[:a, :x, :p], [:b, :y, :q], [:c, nil, :r]]

 [1]から[3]で「シンボル」から成る配列を作り、array1、array2、array3といった変数に格納しています。[4]のように、Array#zipの戻り値の配列の要素の各配列に含まれる要素数は、Array#zipを実行した配列(ここではarray1)の要素数(ここでは3)と同じです。

 この要素数はArray#zipを実行した配列によるので、array2のように足りない部分があるとnilで埋められ、array3のように余分な要素があると無視されます。

Array#mapなどは「クロージャ」の回で

 ここまで、使用頻度の高いメソッドを幾つか紹介しましたが、便利なメソッドはまだまだたくさんあります。

 またArray#sortなど、引数として「ブロック」を与えることができる場合もあり、関数型言語に影響を受けた便利なメソッド(Array#mapなど)もあります。込み入った話になるので、これらのメソッドについては以降の連載の「クロージャ」の回で説明します。

 もっとArrayについて知りたい場合は、リファレンスマニュアルを見てください。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。