言語
日本語
English

Caution

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

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. Enumerable.each_slice / each_cons / chunk / zip

Enumerable.each_slice / each_cons / chunk / zip

対応: Ruby 1.9(2007)

コレクションを一定のサイズで分割したり、複数の要素を結合したりする高度な反復メソッドです。

構文

# n個ずつのグループに分割して反復します。
コレクション.each_slice(n) { |グループ| 処理 }

# n個の連続した要素のまとまりで反復します。
コレクション.each_cons(n) { |グループ| 処理 }

# 要素をn個ずつのチャンクに分けます(ブロックの戻り値が変わる境界で分割)。
コレクション.chunk { |要素| キー }

# 複数の配列を対応するインデックスでまとめます。
配列1.zip(配列2, 配列3)

メソッド一覧

メソッド概要
each_slicen個ずつに分割して繰り返します。最後のグループはn個未満になる場合があります。
each_consn個の連続した要素のウィンドウをずらしながら繰り返します。
chunkブロックの戻り値が変化する境界でグループを区切り、列挙子を返します。
zip対応するインデックスの要素をまとめた配列の配列を返します。

サンプルコード

sample_enumerable_each_slice_each_cons.rb
numbers = [1, 2, 3, 4, 5, 6, 7]

# each_slice で3個ずつ処理します。
numbers.each_slice(3) { |group| puts group.inspect }
# [1, 2, 3]
# [4, 5, 6]
# [7]

# each_cons で3個の連続した組み合わせを取得します。
numbers.each_cons(3) { |group| puts group.inspect }
# [1, 2, 3]
# [2, 3, 4]
# [3, 4, 5]
# [4, 5, 6]
# [5, 6, 7]

# chunk で連続する同じ値をまとめます。
data = [1, 1, 2, 2, 2, 1, 3, 3]
data.chunk { |n| n }.each do |key, group|
  puts "#{key}: #{group.inspect}"
end

# zip で2つの配列を対にします。
names = ["綾波レイ", "碇シンジ", "惣流アスカ"]
scores = [92, 78, 85]
names.zip(scores).each { |n, s| puts "#{n}: #{s}点" }
ruby enumerable_each_slice_each_cons.rb
[1, 2, 3]
[4, 5, 6]
[7]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
1: [1, 1]
2: [2, 2, 2]
1: [1]
3: [3, 3]
綾波レイ: 92点
碇シンジ: 78点
惣流アスカ: 85点

概要

『each_slice』はページネーションや一括処理のバッチサイズ制御に、『each_cons』は移動平均や連続する要素の比較に役立ちます。『each_cons』はスライディングウィンドウ手法を実現します。スライディングウィンドウとは、一定サイズの窓を1つずつずらしながらデータを見ていく手法です。どちらもブロックなしで呼び出すと列挙子(Enumerator)を返します。

『zip』は複数の配列を並べて処理したいときに便利です。対応する要素が存在しない場合は『nil』が補完されるため、配列の長さが異なるときは注意が必要です。『chunk』は連続した同じ属性を持つ要素をまとめるのに使い、『group_by』とは異なり隣接する要素のみをグループ化します。

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