From 18636faf99178d190ec6a0d4af7353387d230986 Mon Sep 17 00:00:00 2001 From: danielsss Date: Thu, 22 Dec 2022 10:44:44 +1100 Subject: [PATCH] Update built-in Hash Map --- .../chapter_hashing/array_hash_map.ts | 38 +++++++------- codes/typescript/chapter_hashing/hash_map.ts | 49 +++++++++++++++++++ docs/chapter_hashing/hash_map.md | 46 ++++++++--------- 3 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 codes/typescript/chapter_hashing/hash_map.ts diff --git a/codes/typescript/chapter_hashing/array_hash_map.ts b/codes/typescript/chapter_hashing/array_hash_map.ts index c1539e031..dde15185a 100644 --- a/codes/typescript/chapter_hashing/array_hash_map.ts +++ b/codes/typescript/chapter_hashing/array_hash_map.ts @@ -18,11 +18,11 @@ class Entry { /* 基于数组简易实现的哈希表 */ class ArrayHashMap { - private readonly bucket: Entry[]; + private readonly bucket: Entry | null[]; constructor() { // 初始化一个长度为 100 的桶(数组) - this.bucket = (new Array(100)).fill(null as any); + this.bucket = (new Array(100)).fill(null); } /* 哈希函数 */ @@ -39,20 +39,20 @@ class ArrayHashMap { } /* 添加操作 */ - public put(key: number, val: string) { + public set(key: number, val: string) { let index = this.hashFunc(key); this.bucket[index] = new Entry(index, val); } /* 删除操作 */ - public remove(key: number) { + public delete(key: number) { let index = this.hashFunc(key); // 置为 null ,代表删除 - this.bucket[index] = null as any; + this.bucket[index] = null; } /* 获取所有键值对 */ - public entrySet(): Entry[] { + public entries(): Entry[] { let arr = []; for (let i = 0; i < this.bucket.length; i++) { if (this.bucket[i]) { @@ -63,7 +63,7 @@ class ArrayHashMap { } /* 获取所有键 */ - public keySet(): number[] { + public keys(): number[] { let arr = []; for (let i = 0; i < this.bucket.length; i++) { if (this.bucket[i]) { @@ -74,7 +74,7 @@ class ArrayHashMap { } /* 获取所有值 */ - public valueSet(): string[] { + public values(): string[] { let arr = []; for (let i = 0; i < this.bucket.length; i++) { if (this.bucket[i]) { @@ -86,7 +86,7 @@ class ArrayHashMap { /* 打印哈希表 */ public print() { - let entrySet = this.entrySet(); + let entrySet = this.entries(); for (const entry of entrySet) { if (!entry) continue; console.info(`${entry.key} -> ${entry.val}`); @@ -94,16 +94,16 @@ class ArrayHashMap { } } - +/* Driver Code */ /* 初始化哈希表 */ const map = new ArrayHashMap(); /* 添加操作 */ // 在哈希表中添加键值对 (key, value) -map.put(12836, '小哈'); -map.put(15937, '小啰'); -map.put(16750, '小算'); -map.put(13276, '小法'); -map.put(10583, '小鸭'); +map.set(12836, '小哈'); +map.set(15937, '小啰'); +map.set(16750, '小算'); +map.set(13276, '小法'); +map.set(10583, '小鸭'); console.info('\n添加完成后,哈希表为\nKey -> Value'); map.print(); @@ -114,21 +114,21 @@ console.info('\n输入学号 15937 ,查询到姓名 ' + name); /* 删除操作 */ // 在哈希表中删除键值对 (key, value) -map.remove(10583); +map.delete(10583); console.info('\n删除 10583 后,哈希表为\nKey -> Value'); map.print(); /* 遍历哈希表 */ console.info('\n遍历键值对 Key->Value'); -for (const entry of map.entrySet()) { +for (const entry of map.entries()) { console.info(entry.key + ' -> ' + entry.val); } console.info('\n单独遍历键 Key'); -for (const key of map.keySet()) { +for (const key of map.keys()) { console.info(key); } console.info('\n单独遍历值 Value'); -for (const val of map.valueSet()) { +for (const val of map.values()) { console.info(val); } diff --git a/codes/typescript/chapter_hashing/hash_map.ts b/codes/typescript/chapter_hashing/hash_map.ts new file mode 100644 index 000000000..3cc968cb6 --- /dev/null +++ b/codes/typescript/chapter_hashing/hash_map.ts @@ -0,0 +1,49 @@ +/* + * File: hash_map.ts + * Created Time: 2022-12-20 + * Author: Daniel (better.sunjian@gmail.com) + */ + +class hash_map { + constructor() { + /* 初始化哈希表 */ + const map = new Map(); + + /* 添加操作 */ + // 在哈希表中添加键值对 (key, value) + map.set(12836, '小哈'); + map.set(15937, '小啰'); + map.set(16750, '小算'); + map.set(13276, '小法'); + map.set(10583, '小鸭'); + console.info('\n添加完成后,哈希表为\nKey -> Value'); + console.info(map); + + /* 查询操作 */ + // 向哈希表输入键 key ,得到值 value + let name = map.get(15937); + console.info('\n输入学号 15937 ,查询到姓名 ' + name); + + /* 删除操作 */ + // 在哈希表中删除键值对 (key, value) + map.delete(10583); + console.info('\n删除 10583 后,哈希表为\nKey -> Value'); + console.info(map); + + /* 遍历哈希表 */ + console.info('\n遍历键值对 Key->Value'); + for (const [k, v] of map.entries()) { + console.info(k + ' -> ' + v); + } + console.info('\n单独遍历键 Key'); + for (const k of map.keys()) { + console.info(k); + } + console.info('\n单独遍历值 Value'); + for (const v of map.values()) { + console.info(v); + } + } +} + +export {}; diff --git a/docs/chapter_hashing/hash_map.md b/docs/chapter_hashing/hash_map.md index b3dc7521d..6d289086b 100644 --- a/docs/chapter_hashing/hash_map.md +++ b/docs/chapter_hashing/hash_map.md @@ -139,16 +139,16 @@ comments: true ```typescript title="hash_map.ts" /* 初始化哈希表 */ - const map = new ArrayHashMap(); + const map = new Map(); /* 添加操作 */ // 在哈希表中添加键值对 (key, value) - map.put(12836, '小哈'); - map.put(15937, '小啰'); - map.put(16750, '小算'); - map.put(13276, '小法'); - map.put(10583, '小鸭'); + map.set(12836, '小哈'); + map.set(15937, '小啰'); + map.set(16750, '小算'); + map.set(13276, '小法'); + map.set(10583, '小鸭'); console.info('\n添加完成后,哈希表为\nKey -> Value'); - map.print(); + console.info(map); /* 查询操作 */ // 向哈希表输入键 key ,得到值 value @@ -157,9 +157,9 @@ comments: true /* 删除操作 */ // 在哈希表中删除键值对 (key, value) - map.remove(10583); + map.delete(10583); console.info('\n删除 10583 后,哈希表为\nKey -> Value'); - map.print(); + console.info(map); ``` === "C" @@ -256,16 +256,16 @@ comments: true ```typescript title="hash_map.ts" /* 遍历哈希表 */ console.info('\n遍历键值对 Key->Value'); - for (const entry of map.entrySet()) { - console.info(entry.key + ' -> ' + entry.val); + for (const [k, v] of map.entries()) { + console.info(k + ' -> ' + v); } console.info('\n单独遍历键 Key'); - for (const key of map.keySet()) { - console.info(key); + for (const k of map.keys()) { + console.info(k); } console.info('\n单独遍历值 Value'); - for (const val of map.valueSet()) { - console.info(val); + for (const v of map.values()) { + console.info(v); } ``` @@ -525,11 +525,11 @@ $$ /* 基于数组简易实现的哈希表 */ class ArrayHashMap { - private readonly bucket: Entry[]; + private readonly bucket: Entry | null[]; constructor() { // 初始化一个长度为 100 的桶(数组) - this.bucket = (new Array(100)).fill(null as any); + this.bucket = (new Array(100)).fill(null); } /* 哈希函数 */ @@ -546,20 +546,20 @@ $$ } /* 添加操作 */ - public put(key: number, val: string) { + public set(key: number, val: string) { let index = this.hashFunc(key); this.bucket[index] = new Entry(index, val); } /* 删除操作 */ - public remove(key: number) { + public delete(key: number) { let index = this.hashFunc(key); // 置为 null ,代表删除 - this.bucket[index] = null as any; + this.bucket[index] = null; } /* 获取所有键值对 */ - public entrySet(): Entry[] { + public entries(): Entry[] { let arr = []; for (let i = 0; i < this.bucket.length; i++) { if (this.bucket[i]) { @@ -570,7 +570,7 @@ $$ } /* 获取所有键 */ - public keySet(): number[] { + public keys(): number[] { let arr = []; for (let i = 0; i < this.bucket.length; i++) { if (this.bucket[i]) { @@ -581,7 +581,7 @@ $$ } /* 获取所有值 */ - public valueSet(): string[] { + public values(): string[] { let arr = []; for (let i = 0; i < this.bucket.length; i++) { if (this.bucket[i]) {