diff --git a/codes/typescript/chapter_hashing/array_hash_map.ts b/codes/typescript/chapter_hashing/array_hash_map.ts index 7ce7eeb32..c1539e031 100644 --- a/codes/typescript/chapter_hashing/array_hash_map.ts +++ b/codes/typescript/chapter_hashing/array_hash_map.ts @@ -6,134 +6,130 @@ /* 键值对 Number -> String */ class Entry { - public key: number; - public val: string; - constructor(key: number, val: string) { - this.key = key; - this.val = val; - } -} + public key: number; + public val: string; -/* 数组的初始化和基本操作 */ -class ArrayList { - - private readonly elements: Entry[]; - constructor(length: number) { - this.elements = new Array(length); - this.initialize(); - } - - /* 初始化 */ - private initialize() { - this.elements.fill(null as any, 0, this.elements.length - 1); - } - - /* 新增和删除 */ - public set(key: number, val: string | null) { - if (val !== null) { - this.elements[key] = new Entry(key, val); - } else { - this.elements[key] = null as any; + constructor(key: number, val: string) { + this.key = key; + this.val = val; } - } - - /* 获取 */ - public get(key: number): string | null { - if (this.elements[key] instanceof Entry) { - return this.elements[key].val; - } - return null; - } - - public entrySet() { - let arr = []; - for (let i = 0; i < this.elements.length; i++) { - if (this.elements[i]) { - arr.push(this.elements[i]); - } - } - return arr; - } - - public valueSet() { - let arr = []; - for (let i = 0; i < this.elements.length; i++) { - if (this.elements[i]) { - arr.push(this.elements[i].val); - } - } - return arr; - } - - public keySet() { - let arr = []; - for (let i = 0; i < this.elements.length; i++) { - if (this.elements[i]) { - arr.push(this.elements[i].key); - } - } - return arr; - } } /* 基于数组简易实现的哈希表 */ class ArrayHashMap { - // 初始化一个长度为 100 的桶(数组) - private bucket: ArrayList; - constructor() { - this.bucket = new ArrayList(100); - } + private readonly bucket: Entry[]; - /* 哈希函数 */ - private hashFunc(key: number): number { - return key % 100; - } - - /* 查询操作 */ - public get(key: number): string | null { - let index = this.hashFunc(key); - let val = this.bucket.get(index); - if (val === null) return null; - return val; - } - - /* 添加操作 */ - public put(key: number, val: string) { - let index = this.hashFunc(key); - this.bucket.set(index, val); - } - - /* 删除操作 */ - public remove(key: number) { - let index = this.hashFunc(key); - // 置为 null ,代表删除 - this.bucket.set(index, null); - } - - /* 获取所有键值对 */ - public entrySet(): Entry[] { - return this.bucket.entrySet(); - } - - /* 获取所有键 */ - public keySet(): number[] { - return this.bucket.keySet(); - } - - /* 获取所有值 */ - public valueSet(): string[] { - return this.bucket.valueSet(); - } - -/* 打印哈希表 */ - public print() { - let entrySet = this.entrySet(); - for (const entry of entrySet) { - if (!entry) continue; - console.info(`${entry.key} -> ${entry.val}`); + constructor() { + // 初始化一个长度为 100 的桶(数组) + this.bucket = (new Array(100)).fill(null as any); + } + + /* 哈希函数 */ + private hashFunc(key: number): number { + return key % 100; + } + + /* 查询操作 */ + public get(key: number): string | null { + let index = this.hashFunc(key); + let entry = this.bucket[index]; + if (entry === null) return null; + return entry.val; + } + + /* 添加操作 */ + public put(key: number, val: string) { + let index = this.hashFunc(key); + this.bucket[index] = new Entry(index, val); + } + + /* 删除操作 */ + public remove(key: number) { + let index = this.hashFunc(key); + // 置为 null ,代表删除 + this.bucket[index] = null as any; + } + + /* 获取所有键值对 */ + public entrySet(): Entry[] { + let arr = []; + for (let i = 0; i < this.bucket.length; i++) { + if (this.bucket[i]) { + arr.push(this.bucket[i]); + } + } + return arr; + } + + /* 获取所有键 */ + public keySet(): number[] { + let arr = []; + for (let i = 0; i < this.bucket.length; i++) { + if (this.bucket[i]) { + arr.push(this.bucket[i].key); + } + } + return arr; + } + + /* 获取所有值 */ + public valueSet(): string[] { + let arr = []; + for (let i = 0; i < this.bucket.length; i++) { + if (this.bucket[i]) { + arr.push(this.bucket[i].val); + } + } + return arr; + } + + /* 打印哈希表 */ + public print() { + let entrySet = this.entrySet(); + for (const entry of entrySet) { + if (!entry) continue; + console.info(`${entry.key} -> ${entry.val}`); + } } - } } -export default ArrayHashMap; + +/* 初始化哈希表 */ +const map = new ArrayHashMap(); +/* 添加操作 */ +// 在哈希表中添加键值对 (key, value) +map.put(12836, '小哈'); +map.put(15937, '小啰'); +map.put(16750, '小算'); +map.put(13276, '小法'); +map.put(10583, '小鸭'); +console.info('\n添加完成后,哈希表为\nKey -> Value'); +map.print(); + +/* 查询操作 */ +// 向哈希表输入键 key ,得到值 value +let name = map.get(15937); +console.info('\n输入学号 15937 ,查询到姓名 ' + name); + +/* 删除操作 */ +// 在哈希表中删除键值对 (key, value) +map.remove(10583); +console.info('\n删除 10583 后,哈希表为\nKey -> Value'); +map.print(); + +/* 遍历哈希表 */ +console.info('\n遍历键值对 Key->Value'); +for (const entry of map.entrySet()) { + console.info(entry.key + ' -> ' + entry.val); +} +console.info('\n单独遍历键 Key'); +for (const key of map.keySet()) { + console.info(key); +} +console.info('\n单独遍历值 Value'); +for (const val of map.valueSet()) { + console.info(val); +} + +export {}; diff --git a/codes/typescript/chapter_hashing/hash_map.ts b/codes/typescript/chapter_hashing/hash_map.ts deleted file mode 100644 index 5e37d5b01..000000000 --- a/codes/typescript/chapter_hashing/hash_map.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * File: hash_map.ts - * Created Time: 2022-12-20 - * Author: Daniel (better.sunjian@gmail.com) - */ - -import ArrayHashMap from './array_hash_map'; - -class HashMap { - - constructor() { - /* 初始化哈希表 */ - const map = new ArrayHashMap(); - /* 添加操作 */ - // 在哈希表中添加键值对 (key, value) - map.put(12836, '小哈'); - map.put(15937, '小啰'); - map.put(16750, '小算'); - map.put(13276, '小法'); - map.put(10583, '小鸭'); - console.info('\n添加完成后,哈希表为\nKey -> Value'); - map.print(); - - /* 查询操作 */ - // 向哈希表输入键 key ,得到值 value - let name = map.get(15937); - console.info('\n输入学号 15937 ,查询到姓名 ' + name); - - /* 删除操作 */ - // 在哈希表中删除键值对 (key, value) - map.remove(10583); - console.info('\n删除 10583 后,哈希表为\nKey -> Value'); - map.print(); - - /* 遍历哈希表 */ - console.info('\n遍历键值对 Key->Value'); - for (const entry of map.entrySet()) { - console.info(entry.key + ' -> ' + entry.val); - } - console.info('\n单独遍历键 Key'); - for (const key of map.keySet()) { - console.info(key); - } - console.info('\n单独遍历值 Value'); - for (const val of map.valueSet()) { - console.info(val); - } - } -} - -export default HashMap; \ No newline at end of file diff --git a/codes/typescript/tsconfig.json b/codes/typescript/tsconfig.json deleted file mode 100644 index 446280b19..000000000 --- a/codes/typescript/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "moduleResolution": "node", - "resolveJsonModule": true, - "module": "commonjs", - "strict": true, - "noEmit": false, - "sourceMap": true, - "baseUrl": ".", - "esModuleInterop": true, - "downlevelIteration": true, - }, - "include": ["./**/*"], -} diff --git a/docs/chapter_hashing/hash_map.md b/docs/chapter_hashing/hash_map.md index 981204b71..896675ec6 100644 --- a/docs/chapter_hashing/hash_map.md +++ b/docs/chapter_hashing/hash_map.md @@ -512,83 +512,24 @@ $$ ```typescript title="array_hash_map.ts" /* 键值对 Number -> String */ class Entry { + public key: number; public val: string; + constructor(key: number, val: string) { this.key = key; this.val = val; } } - - /* 数组的初始化和基本操作 */ - class ArrayList { - - private readonly elements: Entry[]; - constructor(length: number) { - this.elements = new Array(length); - this.initialize(); - } - - /* 初始化 */ - private initialize() { - this.elements.fill(null as any, 0, this.elements.length - 1); - } - - /* 新增和删除 */ - public set(key: number, val: string | null) { - if (val !== null) { - this.elements[key] = new Entry(key, val); - } else { - this.elements[key] = null as any; - } - } - - /* 获取 */ - public get(key: number): string | null { - if (this.elements[key] instanceof Entry) { - return this.elements[key].val; - } - return null; - } - - public entrySet() { - let arr = []; - for (let i = 0; i < this.elements.length; i++) { - if (this.elements[i]) { - arr.push(this.elements[i]); - } - } - return arr; - } - - public valueSet() { - let arr = []; - for (let i = 0; i < this.elements.length; i++) { - if (this.elements[i]) { - arr.push(this.elements[i].val); - } - } - return arr; - } - - public keySet() { - let arr = []; - for (let i = 0; i < this.elements.length; i++) { - if (this.elements[i]) { - arr.push(this.elements[i].key); - } - } - return arr; - } - } /* 基于数组简易实现的哈希表 */ class ArrayHashMap { - // 初始化一个长度为 100 的桶(数组) - private bucket: ArrayList; - + + private readonly bucket: Entry[]; + constructor() { - this.bucket = new ArrayList(100); + // 初始化一个长度为 100 的桶(数组) + this.bucket = (new Array(100)).fill(null as any); } /* 哈希函数 */ @@ -599,37 +540,55 @@ $$ /* 查询操作 */ public get(key: number): string | null { let index = this.hashFunc(key); - let val = this.bucket.get(index); - if (val === null) return null; - return val; + let entry = this.bucket[index]; + if (entry === null) return null; + return entry.val; } /* 添加操作 */ public put(key: number, val: string) { let index = this.hashFunc(key); - this.bucket.set(index, val); + this.bucket[index] = new Entry(index, val); } /* 删除操作 */ public remove(key: number) { let index = this.hashFunc(key); // 置为 null ,代表删除 - this.bucket.set(index, null); + this.bucket[index] = null as any; } /* 获取所有键值对 */ public entrySet(): Entry[] { - return this.bucket.entrySet(); + let arr = []; + for (let i = 0; i < this.bucket.length; i++) { + if (this.bucket[i]) { + arr.push(this.bucket[i]); + } + } + return arr; } /* 获取所有键 */ public keySet(): number[] { - return this.bucket.keySet(); + let arr = []; + for (let i = 0; i < this.bucket.length; i++) { + if (this.bucket[i]) { + arr.push(this.bucket[i].key); + } + } + return arr; } /* 获取所有值 */ public valueSet(): string[] { - return this.bucket.valueSet(); + let arr = []; + for (let i = 0; i < this.bucket.length; i++) { + if (this.bucket[i]) { + arr.push(this.bucket[i].val); + } + } + return arr; } } ```