java HashMap containsKey返回false虽然key存在

som*_*rti 2 java

我使用HashMap数据结构来存储SqMatrix(方阵),其中键的类型为MatrixIndex(包含row和col),值的类型为Integer.

但是当我得到"if(mat.containsKey(key))"的输出时,尽管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);
    }
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么containsKey返回false虽然它存在于HashMap中?

提前致谢,

索姆纳特

set*_*all 6

我不知道是什么MatrixIndex,但是如果它的哈希码实现没有被覆盖,那么每个实例MatrixIndex都有它自己的哈希码,并且被认为是唯一的.因此,您无法传入MatrixIndex的新实例来进行containsKey()检查.

如果你想,准确的代码片段工作,你需要重写equals(),并hashcode()在你的MatrixIndex类,并让这个总是创建该类的重现性,独特的价值.

如果您之前没有这样做,请务必阅读重写这两种方法.快速搜索将带来很多帮助.如果您可以向项目添加新库,请查看:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/HashCodeBuilder.html