【问题标题】:Comparing An Entry In A Map With An Object将地图中的条目与对象进行比较
【发布时间】:2017-02-17 23:39:14
【问题描述】:

我有一个像这样的 Java 地图,

private HashMap<String, Object[][]> theMap;

其中键是一个字符串,而条目将是类似的东西,

theMap = new HashMap<>();

Object[][] theData = {
    {Boolean.FALSE, "Text"}
};

theMap.put("Key1", theData);

我想检查地图中的某个条目是否等同于另一个对象。目前我正在这样做,

Object[][] tempData = {
    {Boolean.FALSE, "Text"}
};

for(Object key: entries.keySet()) {
    if(entries.get(key).equals(tempData)) {
        entries.remove(key);
    }
}

它不工作。

我更喜欢用一个对象而不是另一个地图进行比较。我想知道我在这里的比较做错了什么?

【问题讨论】:

  • 这里的问题基本上是比较两个二维数组,你可以这样:Arrays.deepEquals(array1, array2);
  • 对于 for 循环使用值而不是键。(for(Object value:entries.values()) 使代码更清晰
  • 顺便说一句,因为你正在删除条目,也许你应该使用迭代器。

标签: java dictionary


【解决方案1】:

你没有得到平等的原因是数组继承 Object#equals() 这是基于身份,而不是内容的平等。您可以考虑使用java.util.Arrays.deepEquals(Object[], Object[]) 进行比较。

这就是直接问题的答案。但是,使用Object 的二维数组来保存booleanString 的代码味道确实很糟糕,这表明您需要封装要放入数组的内容。

【讨论】:

  • 这确实解决了我的问题,谢谢。你有什么建议来改变我持有我的数据而不是对象的方式?
  • 绝对是的。但这需要了解您要在地图中存储的内容以设计适当的类。自己试一试,不要忘记适当地实施hashCode()equals()。如果您最终遇到问题,请发布一个新问题。
【解决方案2】:

同一性与等价性

请确保您了解默认情况下Objectequals() 方法会检查两个对象引用是否引用同一个对象(identity),这不是您的代码正在检查。

相反,您的代码正在检查两个对象(您在地图上放置的值)是否具有相同的值(等价)。

这里有两篇关于这个话题的文章:

  1. What is the difference between identity and equality in OOP?
  2. Overriding equals method in Java

在您的这个特殊问题中,我认为解决方案包括两个步骤:

  1. 您的tempDatatheData 似乎不是一个数组 相同类型的元素(它似乎不是二维的 阵列要么)。相反,它包含一个 Boolean 值,然后是一个 String 值。在这种情况下,我认为你真的应该考虑 通过这个东西是什么并为它设计一个类(我正在展示 下面是一个例子)
  2. 该类应覆盖equals()(和hashCode())方法 这样您就可以使用它的equals() 进行等价检查。

还要注意,您的 IDE(例如 Eclipse)可能会为您生成 equals()hashCode() 的模板。

例子:(这里我假设你的Boolean代表一个条件,你的String代表一个消息)

class MyRecord {
    private Boolean condition;
    private String  message;
    public Boolean getCondition() {
        return condition;
    }
    public void setCondition(Boolean condition) {
        this.condition = condition;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((condition == null) ? 0 : condition.hashCode());
        result = prime * result
                + ((message == null) ? 0 : message.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyRecord other = (MyRecord) obj;
        if (condition == null) {
            if (other.condition != null)
                return false;
        } else if (!condition.equals(other.condition))
            return false;
        if (message == null) {
            if (other.message != null)
                return false;
        } else if (!message.equals(other.message))
            return false;
        return true;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 2022-09-30
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2017-07-23
    • 2012-01-26
    • 2018-04-06
    相关资源
    最近更新 更多