プロぽこ

0から覚える Ruby の配列操作![その2] 少し応用的な配列操作を解説

「0から覚える Ruby の配列操作 その1」(前回記事)では基本的に配列への値の追加と取り出し方を解説しました。配列操作のために使える演算子やメソッドはまだまだたくさんあります。

前回記事はこちらです。

0から覚える Ruby の配列操作![その1] 便利メソッドを紹介!

2017.03.31

この記事ではもう少し応用的な配列操作を解説します。配列内から自分の指定した演算の値だけを取り出したり、その逆を行ったりしてみます。

オンラインブートキャンプ 無料体験



数学記号による演算

「&」で配列同士の積集合を取る

「&」演算子を用いることで配列同士の積集合を取得することができます。
積集合なので両方の配列にある値のみが残り、片方の配列にしかない値はなくなってしまいます。

$a = [1,3,5];
$b = [1,3,5];
p $a & $b
# [1,3,5]

$a = [1,3,5];
$b = [2,4,6];
p $a & $b
# []

「*」で配列の各要素に値をかける

配列に「*」演算を使って整数をかけると内部の要素が整数倍されます。これは配列の中身が整数でも文字列でも同様の動作をしてくれます。
例えば要素数が3の配列であれば2倍すると6になるといった動作です。

array = [1,2,3]
p array * 2

# [1, 2, 3, 1, 2, 3]

「+」で配列同士を連結する

「+」演算子を用いることで配列どうしを連結することができます。
文字通り右に指定した配列と左に指定した配列が全部結合された1つの配列が作成されます。

$a = [1, 2, 3]
$b = [4, 5, 6]
p $a + $b
# [1, 2 ,3, 4, 5, 6]

集合ではないので同じ値があった場合でも2つ内包した配列が作成されます。

$a = [1, 2, 3]
$b = [1, 2, 3]
p $a + $b
# [1, 2, 3, 1, 2, 3]

「|」で配列同士の和集合を取る

「|」は和集合なので「+」演算と同じような演算を行うことができます。下記はそれぞれ2つの配列の和集合を取った例です。
2つの配列それぞれに別々の値が入っているので「+」演算と同様の結果となります。

$a = [1, 2, 3]
$b = [4, 5, 6]
p $a | $b
# [1, 2, 3, 4, 5, 6]

2つの配列に同じ値が入っている場合和集合なので、重複が取り除かれた配列が作成されます。
上記のような演算だと「+」演算と同じような結果となりますが、下記のような演算だと違う結果となります。
この違いをちゃんと理解しておかないと思わぬバグをうむことになります。

$a = [1, 2, 3]
$b = [1, 2, 3]
p $a | $b
# [1, 2, 3]

独学は難しい・・・プログラミングはマンツーマン or グループレッスンで学ぶ
【完全無料のプログラミング&就活塾】




配列内の要素を削除する

「delete」メソッドで指定した値を削除する

「delete」メソッドを使用することで引数で渡した値を削除することができます。配列内に指定した値が無い場合は配列にはなにも起こりません。
指定した値があった場合、配列内から値を削除し、削除した値を返り値として返します。

$a = [1, 2, 3]
$value = $a.delete(2)
p $a
# [1, 3]
p $value
$ 2

$b = ["a", "b", "c"]
$b.delete("c")
p $b
# ["a", "b"]

$b.delete("e")
p $b

「delete_at」メソッドで指定した位置にある値を削除する

「delete_at」は配列の指定したインデックスの位置の要素を削除します。「delete」との違いは値を指定するかインデックスを指定するかです。

$a = ["a", "b", "c", "d", "e"]
$a.delete_at(1)
p $a
# ["a", "c", "d", "e"]



配列内から条件を指定して値を取り出す

「map」メソッドで配列内の各要素に演算をした結果を返す

「map」メソッドを使うことで配列内の各要素に自分の書いた演算をした結果を得ることができます。
結果は各要素ごとの演算結果の配列になります。下記の例では各要素を2倍する演算をしています。
この場合演算の結果は返り値として返されます。元の配列自体には影響を与えません。

$a = [1, 2, 3, 4, 5]
$b = $a.map do |value|
  2 * value
end
p $b

# [2, 4, 6, 8 ,10]

「map」メソッドの配列自体を書き換える版が「map!」メソッドです。「!」が付くと各メソッドは配列自体を破壊するメソッドとなります。

$a = [1, 2, 3, 4, 5]
$a.map! do |value|
  2 * value
end
p $a

# [2, 4, 6, 8 ,10]

「select」メソッドで配列内の各要素から真となるものを返す

「select」メソッドは配列内の各要素に自分の書いた演算を行い、「真」と判定されたものだけを返します。
下記の例では「nil」を含む配列からそれを取り除いた配列を返す例です。「map」同様元の配列には影響を与えません。

$array = ["a", nil, "c", "d", nil, nil, "g"]
$result = $array.select do |value|
  value != nil
end
p $result

# ["a", "c", "d", "g"]

「select!」メソッドは配列自体を書き換えるものです。動作内容は「select」メソッドと同様のものです。

$array = ["a", nil, "c", "d", nil, nil, "g"]
$array.select! do |value|
  value != nil
end
p $array

# ["a", "c", "d", "g"]

「reject」メソッドで配列内の各要素から偽となるものを返す

「select」メソッドは配列内の各要素に自分の書いた演算を行い、「偽」と判定されたものだけを返します。
下記の例では処理内容自他は上記に示した「select」と同じ内容となっています。つまり「nil」を含む配列からそれだけの配列を返す例となっています。
ぶっちゃけ使い道がみつからない例ですが、「select」とまったく逆の動作となっていることがわかると思います。

$array = ["a", nil, "c", "d", nil, nil, "g"]
$result = $array.reject do |value|
  value != nil
end
p $result

# [nil, nil, nil]

このメソッドも「reject!」メソッドという破壊的なメソッドが用意されています。こちらを使えば配列自体が書き変わる結果となります。

$array = ["a", nil, "c", "d", nil, nil, "g"]
$array.reject! do |value|
  value != nil
end
p $array

# [nil, nil, nil]

まとめ

この記事では配列内の各値に対して演算を行う方法を解説しました。Ruby では大抵の操作ができるメソッドが用意されています。
各メソッドの違いや特性をよく理解して使いましょう。