配列.join / split / flatten / product
| 対応: | Ruby 1.9(2007) |
|---|
配列と文字列を相互に変換したり、要素の組み合わせ・直積を生成するメソッドです。『join』で配列を文字列に、『split』で文字列を配列に変換できます。
構文
# 配列の要素を区切り文字で連結した文字列を返します。
配列.join(区切り文字)
# 文字列を区切り文字で分割して配列を返します(Stringのメソッド)。
文字列.split(区切り文字)
文字列.split(区切り文字, 上限数)
# 多次元配列を平坦化します。
配列.flatten
配列.flatten(深さ)
# 配列の直積(全要素の組み合わせ)を返します。
配列.product(他の配列, ...)
# 順列・組み合わせを生成します。
配列.permutation(n) { |perm| 処理 }
配列.combination(n) { |comb| 処理 }
メソッド一覧
| メソッド | 概要 |
|---|---|
| join(sep = "") | 要素を区切り文字で連結した文字列を返します。区切り文字を省略すると空文字で連結します。 |
| split(sep) | (Stringのメソッド)文字列を区切り文字で分割した配列を返します。 |
| flatten(depth) | 入れ子の配列を平坦化した新しい配列を返します。深さを省略するとすべて展開します。 |
| product(arr, ...) | すべての配列の要素の組み合わせ(直積)を配列の配列で返します。 |
| permutation(n) | n個の要素の順列をすべて生成します。ブロックなしの場合は Enumerator を返します。 |
| combination(n) | n個の要素の組み合わせをすべて生成します(順序は無視)。 |
| repeated_combination(n) | 重複を許す組み合わせをすべて生成します。 |
サンプルコード
sample_array_join_combination_product.rb
# join:配列を文字列に変換
words = ['Ruby', 'is', 'fun']
puts words.join(' ') # "Ruby is fun"
puts words.join(', ') # "Ruby, is, fun"
puts words.join # "Rubyisfun"
# split:文字列を配列に変換
puts "a,b,c,d".split(',').inspect # ["a", "b", "c", "d"]
puts "hello world".split(' ').inspect # ["hello", "world"]
puts "a,b,c".split(',', 2).inspect # ["a", "b,c"](上限2つで分割)
# join と split を組み合わせたCSV処理
csv_line = "桐生一馬,堂島組,ばかみたい"
name, org, bgm = csv_line.split(',')
puts "#{name}さんの所属は#{org}、BGMは「#{bgm}」です。"
# product:直積(全組み合わせ)
fighters = ['桐生一馬', '真島吾朗']
weapons = ['素手', '武器', '道具']
puts fighters.product(weapons).inspect
# [["桐生一馬", "素手"], ["桐生一馬", "武器"], ["桐生一馬", "道具"], ["真島吾朗", "素手"], ["真島吾朗", "武器"], ["真島吾朗", "道具"]]
# combination:組み合わせ(順序なし)
puts [1, 2, 3, 4].combination(2).to_a.inspect
# [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
# permutation:順列(順序あり)
puts [1, 2, 3].permutation(2).to_a.inspect
# [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
ruby array_join_combination_product.rb Ruby is fun Ruby, is, fun Rubyisfun ["a", "b", "c", "d"] ["hello", "world"] ["a", "b,c"] 桐生一馬さんの所属は堂島組、BGMは「ばかみたい」です。 [["桐生一馬", "素手"], ["桐生一馬", "武器"], ["桐生一馬", "道具"], ["真島吾朗", "素手"], ["真島吾朗", "武器"], ["真島吾朗", "道具"]] [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
概要
『join』と『split』は対になるメソッドで、配列と文字列の相互変換に使います。数値などの非文字列要素が含まれている場合、『join』は自動的に文字列に変換しますが、ネストした配列はフラットに展開されません。入れ子の配列を結合するには、先に『flatten』で平坦化するか、再帰的な処理が必要です。
『product』は全要素の組み合わせ(直積)を生成するため、要素数が多いと結果が膨大になります。例えば5要素の配列3つの直積は5×5×5 = 125件になります。
『combination』と『permutation』はゲームやパズルの解法、テストデータ生成などに活用できます。引数なしで呼ぶと全要素を使った順列・組み合わせを返します。sort_by と組み合わせると、生成した組み合わせを条件でフィルタリングしながら探索できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。