2016-08-17 12 views
1

こんにちは私はそれがexsitの場合よりも存在しない場合は、HashMapでオブジェクトを保存しようとしています。私は新しいデータでその値を制御したいです。データがsthをやりたいと思っているよりも変化している。 else。しかし、私が新しいデータとハッシュ値を比較しようとするたびに、毎回同じように見えました。どうすればこの問題を処理できますか。コードがあります:HashMapはアンドロイドで安定していません

BluetoothLeDevice deviceLe; 
private Map<String, byte[]> mMacMap; 
byte [] integer0 =new byte[4]; 
byte[] tempInteger0=new byte[4]; 

public void addSensor(String macId, BluetoothLeDevice deviceLe) { 
     byte [] addSensorrecord=deviceLe.getScanRecord(); 
     int j=0; 
     for(int i=15;i<19;i++) 
     { 
      integer0 [j]=addSensorrecord[i]; 
      j++; 
     } 
     if (mMacMap.containsKey(macId)) { 
      tempInteger0 = mMacMap.get(macId); 

      if(!integer0 .equals(tempInteger0)) 
      { 
       mMacMap.remove(macId); 
       mMacMap.put(macId, integer0); 
       new SendBLEData().execute(deviceLe); 
      } 

     } else { 
      final byte [] LocalInteger0=new byte[4]; 
      int t=0; 
      for(int i=15;i<19;i++) 
      { 
       LocalInteger0[t]=addSensorrecord[i]; 
       t++; 
      } 
      mMacMap.put(macId, LocalInteger0); 
      new SendBLEData().execute(deviceLe); 
     } 
    } 
+3

ヒント:Javaコーディングスタイルのガイドを読んでください。変数名はlowerCaseから始まります。また、変数の意図について何かを示す名前を使用する必要があります。だから...一体何についてInteger0配列ですか?あなたはコードを書いているだけで、どこにでも混乱を生み出しています。 – GhostCat

+2

次に、コードを理解するために、使用している変数の宣言を見る必要があります。 – GhostCat

+0

デクリメントが追加されました – mesopotamia

答えて

1

すでに投稿されている回答のほんの一部です。

以下の削除は、マップが以前、古い値をキーのマッピングを保持していた場合は、単純なプットがjavadoc

から古い値

mMacMap.remove(macId); 
mMacMap.put(macId, integer0); 

に置き換えられます、必要ありません 指定された値に置き換えられます。 (マップmは、とm.containsKey(k)は真 を返す場合にだけ、キーkの のマッピングが含まれていると言われている。)

あなたは、文字列にバイト15-19を作り、追加する考えがありますそれらをマップキーに追加しますか?これは、配列の比較を排除し、ルックアップをはるかに高速化します。

+0

文字列に変更しています。 – mesopotamia

2

私はあなたの問題がここにあると、推測しています:

!Integer0.equals(tempInteger0)) 

私はあなたが二つの配列を比較したいと思います。あなたはいつもそれらが違うと気づいて驚いています。

問題:配列のequals()は、配列の内容の比較を行いません。言い換えれば:

ここ
int a[] = { 1 }; 
    int b[] = a; 
    int c[] = { 1 }; 

a.equals(b) --> true 
あなたが比較している配列は... 1と同じ場合、equalsへのこの呼び出しは()だけのように、「真」を与えます

しかし

配列の内容の事項を比較した場合、その後、あなたが代わりのArrayListを使用する必要があります
a.equals(c) --> false 

。 2つのArrayListオブジェクトがの場合はと等しく、それらの要素がまったく同じの場合は要素です。

あなたは、あなたがコードで決定を下すために配列上でその等号を使用していることがわかります。ですから、ArrayListsに変更するか、ユーザのハムステッド提案としてArrays.equals()を使用してください。

+0

あなたは正しいかもしれませんが、私がそれをデバッグするとき、私はそれらが同じであることを見ることができます。 – mesopotamia

+0

次に、言い換えることができます:このようなタスクの配列を使用することは間違いなく非常に慣例です。問題の原因となる可能性が高い。 – GhostCat

+0

私の問題は、スキャンレコードが変更されたときに自動的にハッシュマップが更新されます – mesopotamia

0
!Integer0.equals(tempInteger0)) 

は問題です。配列の内容を比較する

使用この:

Arrays.equals(Integer0, tempInteger0) 
+0

私の問題は等価ではありません。問題はハッシュマップです。スキャンレコードが変更されると自動的に更新されます。 – mesopotamia

0

問題は、次の一連のイベントです。mMacMap

  1. macIdない、マップ
  2. macId中にnew byte[4];を挿入mMacMapの場合、前述の配列比較の問題により、前の手順で作成された配列がinteger0に一致することはありません他の回答で、配列がinteger0への参照であることから、それは常に積極的に比較しないだろうとの内容は、もはや更新され、mMacMapinteger0
  3. macIdを参照してマップ内のmacIdを交換してください。
  4. 繰り返し3。基本的にこれらの2つの問題によって引き起こさ

  1. Array#equalsが直感的に動作しない、Javaが重く参照ベースですので、あなたがマップに何かを挿入する場合、それは意志
  2. Arrays.equals
  3. 静的メソッドを使用しますコピーされるのではなく、単に新しい参照が作成されます。後で(配列のように)共有オブジェクトを変更すると、これはあなたを噛んでしまうかもしれません。
関連する問題