0

我有两个带有查询结果的不同哈希图,尽管这两个哈希图是不同大小的哈希图,我试图找到哈希图 A 中存在但哈希图 B 中不存在的记录。

到目前为止,我将发布我的代码;我通过 sql 进行了比较,得到了我想要的结果,但是当我尝试将其放入代码中时,我没有成功。我希望你能指出我正确的方向。提前致谢

HashMap<Integer, HashMap<String, Object>> mapA = new HashMap<>();
HashMap<Integer, HashMap<String, Object>> mapB = new HashMap<>(); 

int m=0;

for (int j = 0; j < mapA.size(); j++) {
    for (int k = 0; k < mapB.size(); k++) {
        if (!mapA.get(j).get("folio").toString().equals(
             mapB.get(k).get("folio").toString())) {
            m++; // count many records not exist on mapB
        }
    }
}
System.out.println(m);
4

2 回答 2

1

我不确定我是否理解你的方法。一个更合适的方法是(在伪代码中):

For each element in Hashmap A:
  If !HashmapB.contains(element):
    ++Counter;
于 2012-07-27T20:18:02.053 回答
1

逻辑上有错误。您希望找到不存在于 A 记录中,但每次迭代 HashMap 的值不相等时递增计数器(在这种情况下您将获得更大的 m)。你的代码应该是这样的。

for (int j = 0; j < mapA.size(); j++) {
    boolean found=false;
    for (int k = 0; k < mapB.size(); k++) {
        if (mapA.get(j).get("folio").toString().equals(
            mapB.get(k).get("folio").toString())) {
            found=true;   
            break;
        }
    }

    if (!found){
       m++; // count many records not exist on mapB
    }
}

还有其他可能的错误。在一般情况下,您必须在 toString 方法之后而不是比较对象之后进行比较(我认为您没有过度使用对象的 toString 方法来返回有效标识符来比较它们。在大多数情况下,它不会返回您需要的内容。或者在换句话说,您应该覆盖哈希图中所有可能的对象的方法,并使用下一个代码进行比较:

mapA.get(j).get("folio").equals(mapB.get(k).get("folio"))

在您的情况下(使用 toString)比较可以始终返回 false,因为典型的 toString 返回类和对象的 ID。

于 2012-07-27T22:45:49.633 回答