我正在尝试使用密钥获取值。我正在使用get()方法。我的关键是一个用int和String组成的对象。所以我制作并反对
HashMap<Keys,String> test = readFile(fileName2);
Keys myKey = new Keys(2,"SM");
test.get(myKey);
我收到了null。当我查看debbuging模式或打印keySet时,我收到了类似的内容
[Keys@d9c6e2, Keys@10285d8, Keys@c3dd7e]
虽然我的密钥应该是
[1,"GM", 2,"SM", 3"PM"]
为什么密钥看起来像Keys@d9c6e2
而不是2,"SM"?
以及如何使用密钥2,"SM"
获取值?
我在Keys中覆盖toString methid。它看起来更好,但我仍然有空值,我确信有一些价值。
Keys myKey = new Keys(2,"GL-G--T");
System.out.println(myKey.toString());
System.out.println(test.get(myKey.toString()));
Set keyset = test.keySet();
System.out.println(keyset);
2,GL-G--T
null
[3,PNSN--G, 2,GL-G--T, 1,SM]
答案 0 :(得分:4)
您需要在Keys对象上覆盖toString方法。否则你将获得default toString provided by java.lang.Object。
您可以实现toString方法,如下所示:
public class Keys {
private final Integer i;
private final String s;
public Keys(Integer i, String s) {
this.i = i;
this.s = s;
}
@Override
public String toString() {
return i + "," + s;
}
}
如果您希望显示引号,那么您需要提供以下内容:
return i + ",\"" + s + "\"";
您还需要override the equals and hashCode才能将此对象用作地图中的键:
@Override
public boolean equals(Object o) {
if (!(o instanceof Keys)) {
return false;
}
Keys other = (Keys)o;
return other.s.equals(s) && other.i.equals(i);
}
@Override
public int hashCode() {
return toString().hashCode();
}
如果不覆盖equals和hashcode,则映射使用默认实现,这会导致两个具有相同值的Keys对象不相等。
答案 1 :(得分:1)
你可以,因为你正在使用一个特殊的Keys对象作为哈希映射的关键 - 然后你需要正确地实现hashCode并在其他人已经解释过的那个Keys类上等于。 / p>
除非你有特殊的理由不这样做,否则你真的可以使用String作为哈希映射的关键。创建一些方法,如下所示:
private static String getHashMapKeyFor(int intKey, String stringKey) {
return stringKey + "|" + intKey;
}
并将哈希映射声明为将String作为键类型。然后,每当您想在哈希映射中放置/查找值时,首先调用上面的方法以获取用于哈希映射的实际密钥。
使用自定义对象类可能会有一种“正确性”或“工程性”的肤浅气氛,但实际上,只使用字符串通常会表现得同样好,如果有任何东西甚至可以稍微节省内存。
答案 2 :(得分:0)
在Keys.java对象中覆盖 toString 方法。目前,它使用java.lang.Object#toString
中定义的方法