【问题标题】:Revert Hashmap to previous value将 Hashmap 恢复为以前的值
【发布时间】:2020-01-15 06:56:38
【问题描述】:

我有一个名为 Varfoo 的类来存储变量。我有另一个名为 Replacement 的类,它使用哈希图将 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 的等号和哈希码:

@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;
}

【问题讨论】:

  • 你能解释更多吗,不清楚吗?你在 Varfoo 类中实现了 hashcode 和 equals 吗?
  • 您需要保留以前值的历史记录。
  • 可能是this的副本?
  • @azro 添加了它们。

标签: java


【解决方案1】:

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

当你创建一个保存点时,你将一个空映射分配给map2get 操作现在首先转到 map2,然后,如果未找到,则转到 map1put 操作仅转到 map2。当您调用forget 时,您再次将null 分配给map2

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

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

【讨论】:

  • 这个答案可以扩展为使用一堆地图,允许设置任意多个“保存点”,然后再恢复。 getcontainsKey 等操作的时间复杂度将取决于当前活动的“保存点”数量。
  • 有这方面的书面例子吗?听起来是个好主意。
  • @reiko1879:对不起,我不知道一个例子。我没有搜索我的想法的普遍可用的实现。
  • 这很简单。您只需将调用转发到当前实际的内部映射即可创建一个类,实现Map 及其所有方法。您可以作为字段维护的那些内部映​​射,例如存储在List<Map<...>> 中。然后你添加这些额外的方法来管理它们。
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多