Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyのArray#zipメソッド徹底解説!2つの配列をスマートに結合する方法

2つの配列を要素ごとに比較して、その違いを見つけたいと思ったことはありませんか?

あるいは、各インデックスごとに最大の数値を求めたい、キーのリストと値のリストを組み合わせてハッシュを作りたい――そんな場面にも出会うことがあるでしょう。

…これを「面倒な方法」で実装すると、次のようなコードになります。

例:冗長な書き方

a = [1,2,3,4,5]
b = [1,2,3,6,8]

c = a.map.with_index { |_, idx| [a[idx], b[idx]] }

# [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]

確かに動作はしますが、あまり美しいコードとは言えませんよね。

しかも、何をしているのか理解するために一瞬立ち止まって考える必要があります。

Array#zipでコードを劇的にシンプルに

ここで登場するのが Array#zipEnumerable#zip も同様)です!

例:zipを使った書き方

a = [1,2,3,4,5]
b = [1,2,3,6,8]

c = a.zip(b)

# [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]

おおっ!…ずっとスッキリしましたね。

そう思いませんか?

zip を知っていれば、コードを見た瞬間に何が行われているのか即座に理解できます。仮に初めて見る場合でも、ドキュメント(あるいはこの記事!)を少し読めばすぐに把握できるでしょう。

zip を使うもう一つの大きなメリットは、他の Enumerable メソッドと簡単にチェーン(メソッド連鎖)できる点です。

例:countメソッドとの組み合わせ

a = [1,2,3,4,5]
b = [1,2,3,6,8]

c = a.zip(b).count { |a,b| a == b }

# 3

このコードは、同じ位置に同じ要素がいくつ存在するかを正確にカウントして返します。

例:キーと値からハッシュを生成

前述したもう一つのテクニックとして、キーのリストと値のリストを結合してハッシュを作る方法があります。

a = %w(bacon coconut walnuts)
b = [100, 200, 300]

a.zip(b).to_h

# {"bacon"=>100, "coconut"=>200, "walnuts"=>300}

もう一つ例を見てみましょうか?

はい、どうぞ!

例:シーザー暗号の実装

letters = Array('a'..'z')
shift   = 3

translation_map = letters.zip(letters.rotate(shift)).to_h

"hello".chars.map { |ch| translation_map[ch] }.join

これは古典的なシーザー暗号アルゴリズムを、わずか数行でエレガントに実装した例です。rotate で文字をずらし、zipto_h で変換マップを作成するという流れが美しく表現されています。

まとめ

今回は、2つの配列を「結合」してさまざまな便利な処理を実現できる Array#zip メソッドについて学びました。要素ごとの比較、ハッシュの生成、暗号化処理など、応用範囲は非常に広いので、ぜひ日々のコーディングで活用してみてください 🙂

この記事が役に立ったら、ぜひお気に入りのSNSでシェアして、より多くの人に読んでもらいましょう!

  1. JavaScriptのgetTime()メソッドとは?使い方とサンプルコードを解説

    getTime()メソッドとはJavaScriptのgetTime()メソッドは、1970年1月1日0時0分0秒(UTC、いわゆる「エポック」)から経過した時間をミリ秒単位で返すDateオブジェクトのメソッドです。この値はUnixタイムスタンプとしても知られており、日付の比較や計算、有効期限の管理など、さまざまな場面で活用されています。以下に、getTime()メソッドを使った具体的なサンプルコードを紹介します。サンプルコード<!DOCTYPE html> <html lang="ja"> <head> <meta charset=

  2. JavaScriptのsort()メソッドとは?配列ソートの基本と比較関数の使い方を解説

    JavaScriptのsort()メソッドは、配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並べ替えの基準に加え、昇順・降順も自由に指定できます。デフォルトでは要素が文字列として比較され昇順にソートされますが、比較関数を渡すことで任意の順序を実現できます。 なお、sort()は元の配列そのものを変更する「破壊的メソッド」である点にも注意しましょう。元の配列を保持したい場合は、スプレッド構文([...arr])などで事前にコピーしておくのが安全です。 コード例 以下は、sort()メソッドを使って配列をソートするシンプルなサンプルコードです。 <!DO