不使用任何内建的哈希表库设计一个哈希映射,设计应该包含以下的功能:
put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。
get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。
remove(key):如果映射中存在这个键,删除这个数值对。
示例:
MyHashMap hashMap = new MyHashMap();
hashMap.put(1, 1);
hashMap.put(2, 2);
hashMap.get(1); // 返回 1
hashMap.get(3); // 返回 -1 (未找到)
hashMap.put(2, 1); // 更新已有的值
hashMap.get(2); // 返回 1
hashMap.remove(2); // 删除键为2的数据
hashMap.get(2); // 返回 -1 (未找到)
注意:
所有的值都在 [0, 1000000]的范围内。
操作的总数目在[1, 10000]范围内。
不要使用内建的哈希库。
package com.loo;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class MyHashMap {
private int key_space;
private List<Bucket> hashmap;
public static void main(String[] args) {
MyHashMap map = new MyHashMap();
map.put(1, 1);
map.put(2, 2);
System.out.println(map.get(1));
System.out.println(map.get(3));
map.put(2, 1);
System.out.println(map.get(2));
map.remove(2);
System.out.println(map.get(2));
}
public MyHashMap () {
this.key_space = 2069;
hashmap = new ArrayList<Bucket>();
for (int i=0;i<this.key_space;i++) {
hashmap.add(new Bucket());
}
}
public void put(int key , int value) {
int key_hash = key % this.key_space;
this.hashmap.get(key_hash).update(key, value);
}
public int get(int key) {
int key_hash = key % this.key_space;
return this.hashmap.get(key_hash).get(key);
}
public void remove(int key) {
int key_hash = key % this.key_space;
this.hashmap.get(key_hash).remove(key);
}
private class Bucket {
private List<PairBean<Integer , Integer>> bucket;
public Bucket() {
bucket = new LinkedList<PairBean<Integer , Integer>>();
}
public Integer get(Integer key) {
for (PairBean<Integer , Integer> pair : bucket) {
if (pair.key.equals(key)) {
return pair.value;
}
}
return -1;
}
public void update(Integer key , Integer value) {
boolean found = false;
for (PairBean<Integer , Integer> pair : bucket) {
if (pair.key.equals(key)) {
pair.value = value;
found = true;
}
}
if (!found) {
bucket.add(new PairBean<Integer , Integer>(key , value));
}
}
public void remove(Integer key) {
for (PairBean<Integer , Integer> pair : bucket) {
if (pair.key.equals(key)) {
bucket.remove(pair);
break;
}
}
}
}
private class PairBean<K,V> {
public K key;
public V value;
public PairBean(K k , V v) {
key = k;
value = v;
}
}
}