我有一个名为Varfoo的类,用于存储变量。我还有一个名为Replacement的类,该类使用一个哈希表将x替换为2。使用忘了方法,就是要忘记将x替换为2。

    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的等于和哈希码:

@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。这是原始地图。 map2null

创建保存点时,将一个空白映射分配给map2。现在,get操作首先进入map2,如果找不到,则进入map1put操作仅进入map2。呼叫forget时,将null再次分配给map2

当然,您必须实现Map接口的所有其他方法。但这应该是一个简单的任务。如有必要,请小心删除(也许您需要Set删除的密钥。

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

10-07 14:11