今回はpaizaの「連想配列」に挑戦!
連想配列とは、キーと値のペアを格納するデータ構造のこと!
問題概要
- 目的
生徒の 出席番号 を入力されたら、その番号に対応する 識別 ID を即座に出力できるようにする。
-
与えられる情報
-
最初に
N : 生徒の人数(出席番号と識別 ID のペアが N 個 与えられる)
K : 先生が答えるべき出席番号の個数
-
- 次に N 行
各生徒の 出席番号 と 識別 ID のペア
- 次に N 行
-
最後に 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()で追加する!
-
:はリテラル限定、動的は[]で!