1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

今回はpaizaの「連想配列」に挑戦!

連想配列とは、キーと値のペアを格納するデータ構造のこと!


問題概要

  • 目的
    生徒の 出席番号 を入力されたら、その番号に対応する 識別 ID を即座に出力できるようにする。

  • 与えられる情報

    1. 最初に
      N : 生徒の人数(出席番号と識別 ID のペアが N 個 与えられる)
      K : 先生が答えるべき出席番号の個数

      1. 次に N 行
        各生徒の 出席番号 と 識別 ID のペア

    2. 最後に K 行
      調べるべき 出席番号 が K 個


  • 求めること

与えられた K 個の出席番号それぞれについて、対応する 識別 ID を 1 行ずつ出力する。



入力例:

4 2
1 Sin
2 Sakura
3 Kayo
4 Yui
4
2

出力例:

Yui
Sakura






✅OKコード例1:Map()

const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];

rl.on('line', (input) => {
    lines.push(input);
});

rl.on('close', () => {
    const [N, K] = lines[0].split(' ').map(Number);
    
    const students = new Map(lines
        .slice(1, N+1)
        .map(line => {
          const [num, id] = line.split(' ');
          return [Number(num), id];
    }));
    
    
    const studentNums = lines.slice(N+1).map(Number);
    
    for(const num of studentNums){
        console.log(students.get(num));
    }
});
  • 出席番号を キー、識別 ID を にする Map を作成。

  • Map.get() で照会番号に対応する ID を出力するだけ。





✅OKコード例2:オブジェクト

    const students = {};
    
    // 生徒データをオブジェクトに登録
    lines.slice(1, N+1).forEach(line => {
      const [num, id] = line.split(' ');
      students[num] = id; // 👈 ここがポイント
    });
    
    const studentNums = lines.slice(N+1).map(Number);
    
    studentNums.forEach(num => {
        console.log(students[num]); // 👈 [] でアクセス
    });

✅ ポイント

① キーは文字列にされる

students[num] = id;

ここで num は数値だけど、
オブジェクトのキーは内部で 文字列に変換される。

だから students[2]students[“2”] と同じ。



② 取り出すときも [] でアクセス

console.log(students[num]);

Map.get(num) の代わりに、obj[num] でアクセスする。



✅オブジェクト

  • オブジェクト {} は JS の基本の連想配列
  • students[key] = value で追加
  • students[key] で取り出し
  • 文字列キーしか使えないのは要注意!





📝まとめ

  • キーがシンプルな文字列 or 数値だけ → オブジェクト {}

  • キーが複雑(数値でも型を区別したい、NaN やオブジェクトもキーにしたい)→ Map()

僕の失敗談(´;ω;`)と解決法🐈






💡おまけ:

オブジェクト {}: でキーと値を定義するもの ― これは「リテラル」で作るときの話で、
実際には「動的にキーを増やす」ときは [] を使って代入する!



▶️ 1️⃣ オブジェクトリテラルの書き方

これは 最初に決まったキーと値 を書くときに使う形。

const obj = {
  name: "Alice",
  age: 20,
  city: "Tokyo"
};

ここで : は「プロパティ名」と「値」を結びつけている。



▶️ 2️⃣ 動的にキーを追加する場合

動的に「後からキーを作って値を入れる」なら
[] を使った代入が定番!

const obj = {};
obj["name"] = "Alice";
obj["age"] = 20;

  • 動的に変数の値をキーにしたいときは必ず obj[変数名] の形で書く
  • 固定なら、obj.name と書いても同じ



✅ . と [] の違い

  • obj.key →  キーが固定文字列の場合
  • obj["key"]  → キーが変数の場合、動的な場合

例えば:

const obj = {};
obj["name"] = "Alice";  // キーは 'name'
obj.name = "Alice";     // これもキーは 'name' で同じ

const obj = {};
const name = "firstName";

obj.name = "Alice";   // → obj は { name: "Alice" }
obj[name] = "Bob";    // → obj は { name: "Alice", firstName: "Bob" }

obj.name は 固定のキー “name” にアクセス/代入しているのに対し、

obj[name] は 変数 name の中身の値(ここでは “firstName”)をキーにしてアクセス/代入している。


最終的にオブジェクトobjはこうなる↓
{
  name: "Alice",
  firstName: "Bob"
}



▶️ 3️⃣ Map は set が必須

Map{} とは違うからsetが必須。

map.set(key, value);

students[num] = id のように = ではできない。



✅ まとめ

  • オブジェクト {}{ key: value } で作る  &  obj[key] = value で後から増やす!

  • Map.set() で追加する!

  • : はリテラル限定、動的は [] で!
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?