【问题标题】:Keys match, but get/containsKey don't find it键匹配,但 get/containsKey 找不到
【发布时间】:2017-02-28 15:17:43
【问题描述】:

我正在尝试从哈希图中检索一个值。键是实现了 equals 和 hashcode 的 TransitionKey 对象。当我使用 equals(...) 比较我要查找的键和 hashmap 中的当前键时,它返回 true,但 get 返回 null 并且 containsKey 返回 false。自从将密钥添加到哈希图中后,我没有以任何方式修改密钥。有人可以帮忙吗?

TransitionKey current  = new TransitionKey(this.currentState, inputSymbol);
    for(TransitionKey tk: transitions.keySet()) {
        System.out.println(tk.equals(current)); // True (only one key in table)
        System.out.println(transitions.containsKey(current)); // false
        String value = transitions.get(tk).toString(); // null
    }

在TransitionKey类中:

    /**
* @override
*/
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof TransitionKey)) return false;
    TransitionKey transitionKey = (TransitionKey) o;
    return (state.equals(transitionKey.state)) && (symbol==transitionKey.symbol);
}

/**
* @override
*/
public int hashcode() {
    int result = (int)symbol;
    result = result*31 + state.hashCode();
    return result;
}

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    您还没有覆盖hashCode,您创建了一个新的hashcode 方法(注意cC)。

    把你的代码改成

    @Override
    public int hashCode() {
        int result = (int)symbol;
        result = result*31 + state.hashCode();
        return result;
    }
    

    它应该按预期工作。

    请注意,如果您没有注释掉 @Override 注释,您会收到一个有用的编译器错误。

    【讨论】:

    • 谢谢。我的 @override 也没有工作,因为我没有大写 o...
    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2020-12-26
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多