私は2つのHashMapを持っています。 mapA.keySet()
はmapB.keySet()
のサブセットです。私はmapA.get(key) != mapB.get(key)
のすべてのキーを印刷したいと思います。しかし、いくつかの奇妙な行動は以下のコードで発生します。Java HashMap奇妙な動作の値が文の後で変わる
private static void printMissingNums(int[] a, int[] b) {
Map<Integer, Integer> mapA = intArrToMap(a);
Map<Integer, Integer> mapB = intArrToMap(b);
Set<Integer> missingNums = new TreeSet<Integer>();
for (int key : mapA.keySet()) {
//This version does not work!
if (mapA.get(key) != mapB.get(key)) {
missingNums.add(key);
}
/* This version works (if I comment out the if statement above
and remove the comments around this block of code)
int valA = mapA.get(key);
int valB = mapB.get(key);
if (valA != valB) {
missingNums.add(key);
}
*/
}
// Unrelated to the strange behavior
for (int key : mapB.keySet()) {
if (!mapA.containsKey(key)) {
missingNums.add(key);
}
}
for (int i : missingNums) {
System.out.print(i + " ");
}
}
私が最初にif文を使用して、私はそれが必要だと思うようには働いていない理由/舞台裏で何が起こっているか知りたいとき、私は奇妙な動作を得ます。私がアクセスできる特定の入力については、x、y、zと呼ばれる3つの数字を出力します。私はHashMapsをチェックして、mapA.get(x) != mapB.get(x)
とmapA.get(y) != mapB.get(y)
だがmapA.get(z) == mapB.get(z)
を見つける。
if文の前後に値を出力しようとしましたが、値は同じですが、何とかif文に入ります。
コメントアウトされたバージョンは期待通りに機能します。 xとyだけを出力します。何が起こっている?私が何も変更していないのに、HashMapの値が変化しているように見えるのはなぜですか?
入力はhttp://pastebin.com/JyYxspjxです。最初の行は最初の配列の要素数で、その後にスペースで区切られた整数が続きます。 これらの次の行は、2番目の配列内の要素の数で、その後にスペースで区切られた整数が続きます。
どのように8622が同じ値を持つ唯一のキーですが、比較はfalseですか?
おそらく、コメントされたバージョンはプリミティブと他のバージョンのオブジェクトを比較するためです。 – dambros
どのようにしてプリミティブを比較するかは、1つの特定のキー8622を除いて問題ありません。(元のポストに入力配列を追加しました)。何が起こっているのですか、あるいは8622が他の比較と異なるのはなぜですか? – mkim123