题目】
哈希表常见的三个操作是put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有的记录的value值都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。
【基本思路】
加入时间戳。
1、把每一个记录都加上一个时间,标记每条记录是合适建立的
2、设置一个setAll记录也加上一个时间,标记setAll记录何时建立
3、查询记录时,如果某条记录的时间早于setAll记录的时间,说明setAll是最新数据,返回setAll记录的值。如果某条记录的时间晚于setAll记录的时间,说明记录的值是最新数据,返回该条记录的值
【点评】哈希表中是K-V键值对,K,V都是对象。自己设计的哈希表MyHashMap肯定有一个成员变量是基本的哈希表HashMap类型的引用。对于传入的类型V,先用自己定义的MyValue对Value包一层,增加成员变量 时间,MyValue<>考虑泛型和V类型一致。
package chapter_9_others;
import java.util.HashMap;
public class Problem_08_SetAllHashMap {
public static class MyValue<V> {
private V value;
private long time;
public MyValue(V value, long time) {
this.value = value;
this.time = time;
}
public V getValue() {
return this.value;
}
public long getTime() {
return this.time;
}
}
public static class MyHashMap<K, V> {
private HashMap<K, MyValue<V>> baseMap;
private long time;
private MyValue<V> setAll;
public MyHashMap() {
this.baseMap = new HashMap<K, MyValue<V>>();
this.time = 0;
this.setAll = new MyValue<V>(null, -1);
}
public boolean containsKey(K key) {
return this.baseMap.containsKey(key);
}
public void put(K key, V value) {
this.baseMap.put(key, new MyValue<V>(value, this.time++));
}
public void setAll(V value) {
this.setAll = new MyValue<V>(value, this.time++);
}
public V get(K key) {
if (this.containsKey(key)) {
if (this.baseMap.get(key).getTime() > this.setAll.getTime()) {
return this.baseMap.get(key).getValue();
} else {
return this.setAll.getValue();
}
} else {
return null;
}
}
}
public static void main(String[] args) {
MyHashMap<String, Integer> test = new MyHashMap<String, Integer>();
test.put("Tom", 1);
test.put("James", 2);
System.out.println(test.containsKey("Tom"));
System.out.println(test.get("Tom"));
System.out.println(test.containsKey("James"));
System.out.println(test.get("James"));
test.setAll(3);
test.put("Rose", 4);
System.out.println(test.get("Tom"));
System.out.println(test.get("James"));
System.out.println(test.get("Rose"));
test.setAll(5);
System.out.println(test.get("Tom"));
System.out.println(test.get("James"));
System.out.println(test.get("Rose"));
}
}