0

クエリ結果を含む2つの異なるハッシュマップがありますが、2つのハッシュマップは異なるサイズのハッシュマップであり、ハッシュマップBには存在しないハッシュマップAに存在するレコードを見つけようとしています。

これまでにコードを投稿します。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メソッドを使用して、オブジェクトを比較するための有効な識別子を返すことはしなかったと思います。ほとんどの場合、必要なものは返されません。言い換えると、ovverideは、ハッシュマップ内のすべてのオブジェクトのメソッドと同等であり、比較のために次のコードを使用する必要があります。

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

あなたの場合(toStringを使用)、典型的なtoStringはオブジェクトのクラスとIDを返すため、比較は常にfalseを返す可能性があります。

于 2012-07-27T22:45:49.633 に答える