我有一个迭代HashMap的方法来获取所有值的总整数。我想避免迭代整个地图并找到自从上次调用此方法以来HashMap没有改变的总和。
如何检查HashMap中是否修改了新值或旧值?有这样的方式吗?
答案 0 :(得分:4)
扩展HashMap;覆盖更改值的方法,并设置一个标志,指示某个值已更改。提供一种测试此值的方法,可能还有一种方法可以重置它。如果在您的应用程序中存在问题,请考虑并发性。
(我相信你理解如何扩展一个类,而且重写这些方法并不意味着你必须重新实现所有这些(超级是你的朋友)。整个班级在我看来并不适合乍一看,要超过30-40行代码。)
答案 1 :(得分:2)
我添加了一个不受时钟解决方案影响的新答案:
public class YourMap<K, V> extends HashMap<K, V> {
private int state = 0;
public YourMap() {
super();
}
@Override
public V put(K key, V value) {
state++;
return super.put(key, value);
}
public boolean isUpdated(int state) {
return (state < this.state);
}
public int getState() {
return state;
}
... // Do the same with clear, remove... methods.
}
然后在你的代码中:
public static void Main() {
new YourMap<Integer, Integer> myMap = new YourMap<Integer, Integer>();
int state = myMap.getState();
myMap.put(1, 2);
System.out.println(myMap.isUpdated(state)); // will print true.
if (!myMap.isUpdated()) { // in this demo, it will never go in this if.
// call your process...
}
}
这个效率很高,你不会遇到currentTimeMilliseconds
应该遇到的问题。
答案 2 :(得分:-2)
public class HashMapWithLastModified<K,V> extends HashMap<K,V> {
private long lastModified;
@Override
public V put(K key, V value) {
lastModified = System.currentTimeMillis();
return super.put(key, value);
}
@Override
public V remove(Object key) {
lastModified = System.currentTimeMillis();
return super.remove(key);
}
@Override
public void clear() {
lastModified = System.currentTimeMillis();
super.clear();
}
public boolean modifiedSince(Date toCheck) {
return lastModified >= toCheck.getTime();
}
}