跳到主要内容

哈希映射

哈希映射(HashMap)

实现


实现MyHashMap类:

  1. MyHashMap() 用空映射初始化对象

  2. void put(int key, int value)HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中,则更新其对应的值 value

  3. int get(int key) 返回特定的 key 所映射的 value; 如果映射中不包含 key 的映射,返回 -1

  4. void remove(key) 如果映射中存在 key 的映射,则移除 key 和它所对应的 value

示例:

输入:
["MyHashMap", "put", "put", "get", "get", "put", "get", "remove", "get"]
[[], [1, 1], [2, 2], [1], [3], [2, 1], [2], [2], [2]]
输出:
[null, null, null, 1, -1, null, 1, null, -1]

解释:
MyHashMap myHashMap = new MyHashMap();
myHashMap.put(1, 1); // myHashMap 现在为 [[1,1]]
myHashMap.put(2, 2); // myHashMap 现在为 [[1,1], [2,2]]
myHashMap.get(1); // 返回 1 ,myHashMap 现在为 [[1,1], [2,2]]
myHashMap.get(3); // 返回 -1(未找到),myHashMap 现在为 [[1,1], [2,2]]
myHashMap.put(2, 1); // myHashMap 现在为 [[1,1], [2,1]](更新已有的值)
myHashMap.get(2); // 返回 1 ,myHashMap 现在为 [[1,1], [2,1]]
myHashMap.remove(2); // 删除键为 2 的数据,myHashMap 现在为 [[1,1]]
myHashMap.get(2); // 返回 -1(未找到),myHashMap 现在为 [[1,1]]

实现

class HashMap {
constructor(capacity) {
this.size = 0;
this.capacity = capacity || 769;
this.data = new Array(this.capacity).fill(0).map(() => new Array());
}
hash(key) {
return key % this.capacity;
}
put(key, value) {
const hash = this.hash(key);
for (const item of this.data[hash]) {
if (item[0] === key) {
item[1] = value;
return;
}
}
this.size++;
this.data[hash].push([key, value]);
}
remove(key) {
const hash = this.hash(key);
const index = this.data[hash].findIndex((item) => item[0] === key);
if (index !== -1) {
this.size--;
this.data[hash].splice(index, 1);
}
}
get(key) {
const hash = this.hash(key);
for (let item of this.data[hash]) {
if (item[0] === key) {
return item[1];
}
}
return -1;
}
containsKey(key) {
const hash = this.hash(key);
for (let item of this.data[hash]) {
if (item[0] === key) {
return true;
}
}
return false;
}
getOrDefault(key, defaultValue) {
let result = this.get(key);
if (result === -1) {
result = defaultValue;
}
return result;
}
}