我使用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中?
提前致谢,
索姆纳特
我不知道是什么MatrixIndex,但是如果它的哈希码实现没有被覆盖,那么每个实例MatrixIndex都有它自己的哈希码,并且被认为是唯一的.因此,您无法传入MatrixIndex的新实例来进行containsKey()检查.
如果你想,准确的代码片段工作,你需要重写equals(),并hashcode()在你的MatrixIndex类,并让这个总是创建该类的重现性,独特的价值.
如果您之前没有这样做,请务必阅读重写这两种方法.快速搜索将带来很多帮助.如果您可以向项目添加新库,请查看:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/HashCodeBuilder.html