2012-03-05 4 views
1

ハッシュマップがあり、whileループの値としてarraylistを挿入しています。反復中にハッシュマップにすでにキーが含まれている場合は、既に格納されているarraylistを取得し、新しいデータを追加してハッシュマップに戻したいと考えています。入力されたハッシュマップから取得されたArraylistは、空のarraylistを返し続けます。

ハッシュマップに値が含まれているかどうかを確認するときに問題が発生します。返されるarraylistはサイズ0のものです。

final HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
String status = ""; 
String channel = ""; 

while (daily.next()) { 
    while (avrg.next()) 
     if (avrg.getString(1).equals(daily.getString(1)) && avrg.getString(2).equals(daily.getString(2))) { 
      final Object pstmnt = null; 
      final Object pstmnt2 = null; 
      final float thresholdValue = calcThreshold(pstmnt, pstmnt2, daily.getString(1)); 
      channel = daily.getString("client_name"); 
      if (daily.getFloat(3) > avrg.getFloat(3) + thresholdValue * avrg.getFloat(3)) { 
       status = "HIGHER"; 
      } 
      else if (daily.getFloat(3) < avrg.getFloat(3) - thresholdValue * avrg.getFloat(3)) { 
       status = "LOWER"; 
      } 
      else { 
       status = "Normal"; 
      } 
      final PrintStream out; 
      out.println(channel); 
      out.println(thresholdValue); 
      out.println(status); 
      if (map.containsKey(channel)) { 
       out.println("map contained key"); 
       final ArrayList<String> temp = new ArrayList<String>(); 
       temp.addAll(map.get(channel)); 
       out.println("previous size: " + temp.size()); 

       temp.add(daily.getString("event")); 
       temp.add(Float.toString(daily.getFloat(3))); 
       temp.add(Float.toString(avrg.getFloat(3))); 
       temp.add(Float.toString(thresholdValue * 100)); 
       temp.add(status); 
       out.println("current size: " + temp.size()); 
       map.put(channel, temp); 
       out.println("array added to map"); 
       temp.clear(); 
       System.out.println("done"); 

      } 

      else { 
       final ArrayList<String> temp = new ArrayList<String>(); 
       out.println("new key created"); 
       temp.add(daily.getString("event")); 
       temp.add(Float.toString(daily.getFloat(3))); 
       temp.add(Float.toString(avrg.getFloat(3))); 
       temp.add(Float.toString(thresholdValue * 100)); 
       temp.add(status); 

       System.out.println(temp.size()); 
       map.put(channel, temp); 
       System.out.println("array added to map"); 
      } 
     } 
    avrg.beforeFirst(); 
} 

なぜこれが起こっているのかわかりません。どんな助けもありがとう!

+1

インデントを修正してください。 – talnicolas

+0

デバッガでプログラムをデバッグしようとするとどうなりますか? –

答えて

5

問題はここです:

map.put(channel, temp); 
out.println("array added to map"); 
temp.clear(); 

temp.clear()はあなただけのマップに追加した同じリストをクリアします。 tempは範囲外に近づいているので、その文は有用な目的ではなく、削除することができます。

+0

ありがとう!!!!!それはそれを固定!私は知りたいのですが、なぜtemp.clear()が私が挿入したarraylistに影響を与えたのですか?ハッシュマップにarraylistを挿入した後、clear文が呼び出された – user1192724

+1

@ user1192724: 'map.put()'はデータをコピーしません。 'temp 'と同じ参照を挿入します。したがって、挿入後の 'temp'リストの内容を変更すると、変更内容がマップに反映されます。 – NPE

+0

ああ、私は見る...それは非常に有用な情報です。どうもありがとうございました! – user1192724

1

@aixには正しい答えがありますが、すべての重複を取り除くためにコードを書き直すべきです。
if (map.containsKey(channel))

から始まるifブロックは、次のように簡略化することができます。

ArrayList<String> temp = map.get(channel); 

if (temp == null) { 
    out.println("new key created"); 
    ArrayList<String> temp = new ArrayList<String>(); 
    map.put(channel, temp); 
} 

temp.add(daily.getString("event")); 
temp.add(Float.toString(daily.getFloat(3))); 
temp.add(Float.toString(avrg.getFloat(3))); 
temp.add(Float.toString(thresholdValue * 100)); 
temp.add(status); 

追加するたびに新しいリストを作成してコピーする必要はありません。

関連する問題