1. 描述
问题描述: 重新构建HashMap的put(),get()方法,并添加setAll()方法,setAll()方法会将当前所有key对应的value值改为参数值。
2. 流程
- time记录当前put数据的时刻,每次加1;
- all用于存放setAll的数据;
- setAllTime记录setAll数据的时刻,同时time加1;
- newHashMap内部的HashMap存放的键值对为:< key,(value,time) >,用time标志记录数据进入的时刻;
- get数据时,判断存入时间time与setAllTime的大小,如果其小于setAllTime,说明当前value已经被all替换,返回all的值;如果大于,则说明value值是在setAll后添加的,则获取得到原本的value值。
3. 实现
//以HashMap<Integer,Integer>为例:
class NewHashMap{
class Combine{ // 存放value和time值
Integer value;
Long time;
public Combine(Integer value, Long time) {
this.value = value;
this.time = time;
}
}
private int all = 0;
private long time = 0;
private long setAllTime = Long.MIN_VALUE; // 默认最小值
private HashMap<Integer,Combine> hashMap = new HashMap<>(); // 内部存储结构
public void put(Integer key,Integer value){ // put方法
hashMap.put(key,new Combine(value,time++));
}
public void setAll(int all){ //setAll方法
this.all = all;
this.setAllTime = this.time++;
}
public Integer get(Integer key){ // get方法
if(hashMap.get(key).time<setAllTime)
return all;
else
return hashMap.get(key).value;
}
}
4. 测试
NewHashMap newHashMap = new NewHashMap();
newHashMap.put(1,3);
newHashMap.put(2,4);
newHashMap.put(7,6);
System.out.println(newHashMap.get(2)); // 4
System.out.println(newHashMap.get(7)); // 6
newHashMap.setAll(12); // setAll为12
System.out.println(newHashMap.get(1)); // 12
System.out.println(newHashMap.get(2)); // 12
System.out.println(newHashMap.get(7)); // 12
newHashMap.put(6,9);
System.out.println(newHashMap.get(6)); // 9
newHashMap.setAll(6); // setAll为6
System.out.println(newHashMap.get(1)); // 6
System.out.println(newHashMap.get(2)); // 6
System.out.println(newHashMap.get(7)); // 6
newHashMap.put(1,4);
System.out.println(newHashMap.get(1)); // 4