检查是否修改了HashMap(添加或修改了值)

时间:2014-06-04 13:39:06

标签: java map hashmap

我有一个迭代HashMap的方法来获取所有值的总整数。我想避免迭代整个地图并找到自从上次调用此方法以来HashMap没有改变的总和。

如何检查HashMap中是否修改了新值或旧值?有这样的方式吗?

3 个答案:

答案 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();
    }
}