Java 将Hashmap恢复为以前的值

Java 将Hashmap恢复为以前的值,java,Java,我有一个名为Varfoo的类,它存储变量。我有另一个名为Replacement的类,它使用hashmap将x替换为2。使用忘记方法,意味着忘记用2替换x Varfoo x = new VarFoo("x"); Replacement s = new Replacement(); s.put(new VarFoo("x"), new IntFoo(2)); x.applyReplacement(s); s.forget(x); 以下是遗忘方法: publi

我有一个名为Varfoo的类,它存储变量。我有另一个名为Replacement的类,它使用hashmap将x替换为2。使用忘记方法,意味着忘记用2替换x

    Varfoo x = new VarFoo("x");
    Replacement s = new Replacement();
    s.put(new VarFoo("x"), new IntFoo(2));
    x.applyReplacement(s);
    s.forget(x);
以下是遗忘方法:

public boolean forget(VarFoo var) {
    if (var == null) {
        throw new NullPointerException();
    } else {
        if (replacementMap.containsKey(var)) {
            replacementMap.remove(var);
            return true;
        } else {
            return false;
        }
    }
}
它将导致null,因为我删除了密钥本身,而不是我想要的。我如何使它恢复原状

Varfoo的Equals和hashcodes:

@Override
public boolean equals(Object o) {
    if (o == null) return false;
    if (!(o instanceof VarFoo))
        return false;
    if (o == this)
        return true;
    return name.equals(((VarFoo) o).name);
}

@Override
public int hashCode() {
    int prime = 31;
    int result = 1;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}

您可以创建一个新的
Map
实现,它包含两个(例如
HashMaps
)。在正常模式下,它将每个操作转发到
map1
。这是原始地图
map2
null

创建保存点时,将空映射分配给
map2
get
操作现在首先转到
map2
,如果找不到,则转到
map1
<代码>放置操作仅转到
map2
。调用
forget
时,再次将
null
分配给
map2

当然,您必须实现
Map
接口的所有其他方法。但这应该是一项简单的任务。如果需要,请注意删除(可能您需要设置一组删除的键)


提示:您可以使用
java.util.AbstractMap
作为实现的基础。

您可以解释更多,这还不清楚吗?您是否在Varfoo类中实现了hashcode和equals?您需要保留以前值的历史记录。可能是@azro添加的值的副本。这个答案可以扩展为使用一堆映射,允许ar要设置和稍后恢复的“保存点”位非常多。
get
containsKey
等操作的时间复杂性将取决于“保存点”的数量当前处于活动状态。是否有此方面的书面示例?听起来是个好主意。@reiko1879:抱歉,我不知道示例。我没有搜索我的想法的通用实现。这非常简单。您创建一个类,实现
Map
及其所有方法,只需将调用转发到当前实际的内部映射。您可以作为字段维护的那些内部映射,例如存储在
列表中的
。然后添加这些额外的方法来管理它们。