🐷

🤦‍♀️また、「マップ(Map)」

2024/10/18に公開

他の記事でも出てきましたが、また出てきてつぶせていないので、書きます。
https://zenn.dev/milbon/articles/e95ea3cf3ea734

Map とは?
具体的には、JavaScript でデータをキーと値のペアとして保存するためのオブジェクトの一種です。
Map は JavaScript の組み込みオブジェクトで、キーと値のペアを保存するためのデータ構造です。Map を使用すると、特定のキーに対して特定の値を保存し、それをあとから効率的に取得することができます。Map はキーにあらゆる型のデータを使えるのが特徴です。

たとえば、次のように使用します。

// 新しい Map の作成
const map = new Map();

// 値を追加する
map.set('key1', 'value1');
map.set('key2', 'value2');

// 値を取得する
console.log(map.get('key1')); // 出力: value1

// キーが存在するか確認
console.log(map.has('key2')); // 出力: true

// 値を削除する
map.delete('key1');

// サイズを確認する
console.log(map.size); // 出力: 1

Map とオブジェクトの違い
JavaScript にはすでにオブジェクトがあり、オブジェクトもキーと値のペアを持つことができますが、Map にはいくつかの利点があります。

キーに任意の型を使用可能:

Map はキーに文字列だけでなく、オブジェクトや関数など任意の型を使うことができます。
一方で、オブジェクトはキーに文字列またはシンボルだけを使います。

キーの順番の保証:

Map ではキーが追加された順番が保証されます。
オブジェクトの場合、順序は保証されないことがあります。

サイズの取得が簡単:

Map の場合、size プロパティを使ってエントリーの数を簡単に取得できます。
オブジェクトの場合は手動でカウントする必要があります。

Map の使い方のポイント

作成

const map = new Map<number,number>();

として Map を作成します。

値の設定

map.set(key, value)

で、キーと値のペアを保存します。

値の取得

map.get(key)

で、指定したキーの値を取得します。

キーの存在確認

map.has(key)

で、特定のキーが存在するかどうかを確認できます。

サイズの確認

map.size

で、現在のキーと値のペアの数を取得します。

2 つの文字列配列 words1 と words2 が与えられた場合、2 つの配列のそれぞれに 1 回だけ出現する文字列の数を返します。

例:

Input: words1 = ["leetcode","is","amazing","as","is"], words2 = ["amazing","leetcode","is"]
Output: 2
function countWords(words1: string[], words2: string[]): number {
    // 各配列内の単語の出現回数をカウントするためのマップ
    const countMap1 = new Map<string, number>();
    const countMap2 = new Map<string, number>();

    // words1 の出現回数をカウント
    // countMap1.setで words1 の各要素(word)をキーにして、その出現回数を記録する
    // countMap1.get(word) で、現在の出現回数を取得し、それに 1 を加えることで更新する
    for (const word of words1) {
        countMap1.set(word, (countMap1.get(word) || 0) + 1);
    }

    // words2 の出現回数をカウント
    // countMap2 を使って words2 の各要素を同様にカウントする
    for (const word of words2) {
        countMap2.set(word, (countMap2.get(word) || 0) + 1);
    }

    // リターンする変数 count を定義
    let count = 0;

    // words1 の各単語をループして、両方の配列で1回だけ出現するか確認
    // const [word, freq] は countMap1 から取得するキー(word)とその出現回数(freq)を表す
    for (const [word, freq] of countMap1.entries()) {
        // words1 における出現回数が 1 で、かつ words2 における出現回数も 1 であるかを確認
        if (freq === 1 && countMap2.get(word) === 1) {
            count++;
        }
    }

    return count;
}

Discussion