言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 配列.concat / + / flatten / zip

配列.concat / + / flatten / zip

対応: Ruby 1.8(2003)

複数の配列を結合したり、要素ごとに組み合わせるメソッドです。演算子(『+』『-』『&』『|』)を使った集合演算や、『zip』による対応付けができます。

構文

# 配列を結合した新しい配列を返します。
配列.concat(他の配列, ...)
配列 + 他の配列

# 集合演算(差集合・積集合・和集合)
配列 - 他の配列 # 差集合:左側にあって右側にない要素
配列 & 他の配列 # 積集合:両方に共通する要素
配列 | 他の配列 # 和集合:どちらかにある要素(重複なし)

# 入れ子の配列を平坦化します。
配列.flatten
配列.flatten(深さ)

# 複数の配列の要素を対応付けた配列を返します。
配列.zip(他の配列, ...)

メソッド一覧

メソッド / 演算子概要
concat(arr, ...)引数の配列の要素を末尾に追加します(破壊的)。複数の配列を一度に指定できます。
array + other2つの配列を結合した新しい配列を返します(非破壊的)。
array - other差集合を返します。右側の配列に含まれる要素を左側から取り除いた配列です。
array & other積集合を返します。両方の配列に共通する要素だけを含む配列です(重複なし)。
array | other和集合を返します。どちらかの配列に含まれる要素をすべて含む配列です(重複なし)。
flatten(depth)入れ子の配列を平坦化した新しい配列を返します。深さを指定すると指定レベルまで展開します。
zip(arr, ...)対応するインデックスの要素を組み合わせた配列の配列を返します。

サンプルコード

sample_array_concat_plus_zip.rb
# 配列の結合
a = [1, 2, 3]
b = [4, 5, 6]
puts (a + b).inspect # [1, 2, 3, 4, 5, 6]

c = [1, 2, 3]
c.concat([4, 5], [6, 7]) # 破壊的:元の配列に追加します
puts c.inspect # [1, 2, 3, 4, 5, 6, 7]

# 集合演算
x = [1, 2, 3, 4, 5]
y = [3, 4, 5, 6, 7]
puts (x - y).inspect # [1, 2](差集合)
puts (x & y).inspect # [3, 4, 5](積集合)
puts (x | y).inspect # [1, 2, 3, 4, 5, 6, 7](和集合)

# 重複の除去にも活用できます
names = ['item_a', 'item_b', 'item_a', 'item_c', 'item_b']
puts (names | []).inspect # ["item_a", "item_b", "item_c"](重複なし)

# flatten で入れ子を平坦化
nested = [1, [2, 3], [4, [5, 6]]]
puts nested.flatten.inspect # [1, 2, 3, 4, 5, 6](すべて展開)
puts nested.flatten(1).inspect # [1, 2, 3, 4, [5, 6]](1段階だけ展開)

# zip で複数配列を対応付け
keys = [:name, :category, :code]
values = ['item_a', 'category_x', 'code_100']
puts keys.zip(values).inspect
# [[:name, "item_a"], [:category, "category_x"], [:code, "code_100"]]

# zip の結果を Hash に変換する定番テクニック
hash = keys.zip(values).to_h
puts hash.inspect # {:name=>"item_a", :category=>"category_x", :code=>"code_100"}

実行すると次のように出力されます。

ruby array_concat_plus_zip.rb
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 2]
[3, 4, 5]
[1, 2, 3, 4, 5, 6, 7]
["item_a", "item_b", "item_c"]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, [5, 6]]
[[:name, "item_a"], [:category, "category_x"], [:code, "code_100"]]
{:name=>"item_a", :category=>"category_x", :code=>"code_100"}

概要

配列の結合には『+』(非破壊)と『concat』(破壊的)の2種類があります。『+』は新しい配列を返すため元の配列は変更されませんが、『concat』は元の配列を直接変更します。大量データを扱う場合は、新しいオブジェクトを生成しない『concat』の方がメモリ効率が良いです。

集合演算子(『-』『&』『|』)は重複を自動で取り除きます。共通要素の抽出や差分チェックに便利です。重複の除去だけが目的なら『uniq』メソッドもあります。

『zip』は複数の配列を「横に並べて」組み合わせるイメージです。キーと値の配列から『to_h』でハッシュを作成する定番のテクニックによく使われます。each_with_indexと組み合わせると、インデックスを使った処理も簡潔に書けます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。