Java 将Hashmap恢复为以前的值
我有一个名为Varfoo的类,它存储变量。我有另一个名为Replacement的类,它使用hashmap将x替换为2。使用忘记方法,意味着忘记用2替换xJava 将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 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
及其所有方法,只需将调用转发到当前实际的内部映射。您可以作为字段维护的那些内部映射,例如存储在列表中的。然后添加这些额外的方法来管理它们。