我有一个名为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
。这是原始地图。 map2
是null
。
创建保存点时,将一个空白映射分配给map2
。现在,get
操作首先进入map2
,如果找不到,则进入map1
。 put
操作仅进入map2
。呼叫forget
时,将null
再次分配给map2
。
当然,您必须实现Map
接口的所有其他方法。但这应该是一个简单的任务。如有必要,请小心删除(也许您需要Set
删除的密钥。
提示:您可以使用java.util.AbstractMap
作为实现的基础。