2017-11-28 6 views
3

私はJavaでハッシュテーブルを作成しています。 検索機能では、IF文で比較しています。それは比較をしていません。Javaで比較が機能しない場合

ここは私のコードの一部です。


while (table[pos]!=null) { 
     if (table[pos]==key) { 
      System.out.println("SEARCH "+key+" at INDEX "+home); 
      return; 
     } 
     else {pos=h(home+p(i)); 
     i++; 
     } 
    } 
    System.out.println("Failed to find "+key+"."); 
    return; 
} 

それはテーブル[POS]とキーが同じであっても動作しません! しかし、私は非常に単純な代入変数を別の変数に追加します。それは動作します!なぜそれが動作するのかわかりません。私は、table[pos]keyInteger両方(あなたがwhile文でnullにそれを比較しているのでtable[pos]は、参照型でなければならない)であれば、それはまあ

while (table[pos]!=null) { 
     int x = table[pos]; 
     if (x==key) { 
      System.out.println("SEARCH "+key+" at INDEX "+home); 
      return; 
     } 
     else {pos=h(home+p(i)); 
     i++; 
     } 
    } 
    System.out.println("Failed to find "+key+"."); 
    return; 
} 
+0

これはHashMapは内部的にそれをしない方法の例です。あなた自身の正確な問題(現時点では不明)、つまり入力、実際の出力、期待される出力、そして問題自体を示す小さな実行可能な例を今私たちに提供しています。適切なコードを立てることで、問題をより明確に特定するのに役立ちます:) – SomeJavaGuy

+0

"それは何も比較していません"とはどういう意味ですか?あなたはそれを行ごとにデバッグしたとき何が起こったのですか? –

+0

テーブルは未定義です。 [最小限の完全で検証可能な例]を追加してください(http://stackoverflow.com/help/mcve)。 – Clijsters

答えて

7

をXD知っている、彼らはequalsと比較する必要がありますしたいです異なるIntegerオブジェクトが同じint値を持つ可能性があるため、==ではありません。

変数xtable[pos]を割り当てると、それはプリミティブ値の表示が解除されます。 key

、あなたがIntegerkeyintxを比較し、またintに非ボックス化され、そしてint比較が==で動作します。

false 
true 

コードのコードは次のようになります:

Integer i1 = 300; 
Integer i2 = 300; 
System.out.println (i1 == i2); 
int i3 = i1; 
System.out.println (i3 == i2); 

出力:

この

は、以下の簡単な例により実証することができる

while (table[pos] != null) { 
    if (table[pos].equals(key)) { 
     System.out.println("SEARCH "+key+" at INDEX "+home); 
     return; 
    } else { 
     pos = h(home + p(i)); 
     i++; 
    } 
} 
System.out.println("Failed to find "+key+"."); 
+0

実際には本当にありません。 '=='と 'equals'の両方を使うべきです。最初はより高速なチェックとして機能します。これは 'HashMap'が内部的にするものです:'((k = first.key)== key ||(key!= null && key.equals(k)))) ' – Eugene

0

==と2つのオブジェクトを比較しますこれらの参照の両方がメモリ内の同じ場所を指しているかどうかをチェックし、プリミティブで==を使用すると、値が同じかどうかが単純にチェックされます。 Integersの2つの値の方程式を正しく調べるには、equals()メソッドを使用する必要があります。

2番目の例では、Integerからintまでのアンボックスを使用していたので、期待どおりに値を確認しました。最初のものでは、両方の値がメモリ内の同じ場所を指しているかどうかを比較しました。

0

実は正しい方法は、たとえば、この方法は、私たちは常に確認することになるんばかりHashMapよう両方を使用することです。

if(((k = first.key) == key || (key != null && key.equals(k)))) ... 

は、だからあなたの場合には、それは次のようになります:// stackoverflowの:あなたは[MCVE](HTTPSを含める必要があります

if ((table[pos] == key) || (key != null && (table[pos].equals(key)))) { 
関連する問題