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

JavaScriptで配列内の同じ値のペアを数える方法

本記事では、重複した値を含む可能性のある整数の配列を受け取り、その中から同じ値どうしのペアがいくつ作れるかを求めるJavaScript関数の実装方法を解説します。

問題の概要

たとえば、次のような入力配列が与えられたとします。

const arr = [1, 5, 2, 1, 6, 2, 2, 9];

この場合、期待される出力は次のとおりです。

const output = 2;

これは、配列内に「1と1」「2と2」というペアがそれぞれ1組ずつ存在するためです。なお、2は3つあるため1つは余りますが、ペアとしては1組とカウントされます。

アルゴリズムの考え方

この問題を解く最もシンプルなアプローチは、以下の手順に従うことです。

  1. 元の配列を変更しないよう、slice()でシャローコピーを作成します。
  2. コピーした配列を昇順にソートします。ソート後は同じ値が必ず隣り合って並びます。
  3. 隣接する2つの要素を比較し、等しければペアとしてカウントし、インデックスを2つ進めます(すでに使った値を再度数えないため)。

この方法の計算量はソート処理が支配的となるため、O(n log n)となります。データ量がそこまで多くないケースでは十分に高速で、可読性も高い実装です。

コード例

実際のコードは次のとおりです。

const arr = [1, 5, 2, 1, 6, 2, 2, 9];

const countPairs = (arr = []) => {
    const { length } = arr;
    let count = 0;
    // シャローコピーを作成し、元の配列が変更されないようにする
    const copy = arr.slice();
    copy.sort((a, b) => a - b);
    for (let i = 0; i < length; i++) {
        if (copy[i] === copy[i + 1]) {
            i++;
            count++;
        }
    }
    return count;
};

console.log(countPairs(arr));

実行結果

上記のコードをコンソールで実行すると、次の出力が得られます。

2

配列 [1, 5, 2, 1, 6, 2, 2, 9] には同じ値のペアが2組(1のペアと2のペア)含まれているため、正しく 2 が出力されます。

まとめ

ソートして隣接要素を比較するだけのシンプルなアルゴリズムでも、配列内の同一値ペアを効率よく数えられます。元の配列を破壊しないようコピーを取る点と、ペア成立時にインデックスを2つ進める点が実装上のポイントです。より大規模なデータを扱う場合は、オブジェクトやMapを使って各値の出現回数を集計し、「回数 ÷ 2 の切り捨て」を合計する手法(計算量O(n))も検討するとよいでしょう。

  1. 【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説

    JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio

  2. JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説

    Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g