我使用HashMap数据结构来存储SqMatrix(方阵),其中键的类型为MatrixIndex(包含row和col),值的类型为Integer。
但是当我作为“if(mat.containsKey(key))”的输出变为false时,尽管HashMap中有相应的键。
主要代码:
public static void main(String[] args) {
Random generator = new Random();
int val = 0;
Types.MatrixIndex key, key1;
int matSz = (int) Math.floor(Math.sqrt(10));
Types.SqMatrix mat = new Types().new SqMatrix(matSz); //matSz*matSz elements
//HashMap<Types.MatrixIndex,Integer> hMap= new HashMap<Types.MatrixIndex,Integer>(10);
for (int r=0; r<matSz; r++) {
for (int c=0; c<matSz; c++) {
if (r<c) {
val = generator.nextInt(2) > 0? -1 : val;
key =(new Types()).new MatrixIndex(r, c);
key1 = (new Types()).new MatrixIndex(c, r);
mat.put(key, val);
mat.put(key1, val);
generator.setSeed(System.currentTimeMillis());
}
}
}
for (int r=0; r<matSz; r++) {
val = 0;
for (int c=0; c<matSz; c++) {
if (r!=c) {
key = (new Types()).new MatrixIndex(r, c);
if (mat.containsKey(key)) {
val = val + mat.get(key);
}
}
}
key1 = (new Types()).new MatrixIndex(r, r);
mat.put(key1, val);
}
有没有人知道为什么containsKey返回false虽然它存在于HashMap中?
提前致谢,
索姆纳特
答案 0 :(得分:6)
我不知道MatrixIndex
是什么,但是如果它的哈希码实现没有被覆盖,那么MatrixIndex
的每个实例都有它自己的哈希码,并且被认为是唯一的。因此,您无法传入MatrixIndex的新实例来执行containsKey()
检查。
如果您希望确切的代码段有效,则需要覆盖MatrixIndex类中的equals()
和hashcode()
,并使其始终为该类创建可重现的唯一值。
如果您之前没有这样做,请务必阅读覆盖这两种方法的内容。快速搜索将带来很多帮助。如果您可以向项目添加新库,请查看:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/HashCodeBuilder.html
答案 1 :(得分:4)
您在equals()
课程中(正确)定义了hashCode()
和MatrixIndex
吗?
答案 2 :(得分:3)
要使containsKey()
成功,两个对象(您测试的对象和Map的键中找到的对象)必须具有相同的hashCode()
(对于非空对象)和{{1}必须[对称]为他们成功。
equals()
“当且仅当此映射包含键k的映射时才返回true(key == null?k == null:key.equals(k))。(有)最多可以是一个这样的映射。)“(reference)。
答案 3 :(得分:2)
很可能您忘记覆盖MatrixIndex.hashCode()
和/或MatrixIndex.equals()
。继承自Object
类的默认版本比较对象标识,而不是对象的内容,并且不会执行您可能期望的操作。