2011-07-15 17 views
0

Javaの参照割り当てに問題があります。
私の説明:私のコードでは、後でHashMapの値として代入されるBooleanWrapのArrayList(家で作られたブール値のクラス)を使用しています(このArrayListの値を更新するサイクルがあります条件が確認されるまで)。このような
何か:Javaで変数を再利用する際の問題

ArrayList<BooleanWrap> temp=new ArrayList <BooleanWrap>(48); 

//cycle: operations to fill the ArrayList, then a condition is satisfied 

hashMap.put(index, temp); 

その後、私は一時変数を再利用する必要があるので、私はそれを再初期化する必要があります。私は、次の手順でそれを行う:ハッシュマップの値は、変数の参照だけではなく、実際の値が保存されますように割り当てるTEMP:私の問題が来る

for(BooleanWrap bool: temp){ 
    bool.set(false); 
    } 


したがって、tempを再初期化すると、ハッシュマップ内の更新も発生します(この場合、すべてをfalseに設定します)。
今、私はclone()メソッドでも、同じ結果(ArrayListの浅いコピーを生成するため)を得るべきだと思います。
後でその参照をハッシュマップに割り当てることなく、同じ変数tempを自分のサイクルで再利用する方法はありますか?
実際に私は、ArrayListの深いコピーを作成する方法でそれを行うことができます。

public static ArrayList<BooleanWrap> deepcopy(ArrayList<BooleanWrap> original){ 

    ArrayList<BooleanWrap> copy=new ArrayList<BooleanWrap>(48); 
    for(BooleanWrap bool: original) 
     copy.add(new BooleanWrap (bool.get())); 

    return copy; 

} 

が、私は他の方法がなく、それができるように短いなどのインライン行って何かを、必要とします。

アドバイス/提案/侮辱?

+2

ブール値はすでにJavaに存在します。カスタムブールラッパーは必要ありません。また、なぜあなたは一時的なものを再利用する必要があるのか​​分かりません。なぜ新しい変数を使用しないのですか?代わりに、 'ArrayList'の新しいインスタンスをtempに割り当てるだけではどうですか?私はあなたに良い理由があると確信していますが、私はあなたの質問に基づいてそれらを理解することはできません。 – dlev

+0

私は自分のサイクルで私は何回私は私のハッシュマップに入れようとしているのか分からないので、一時的なものを再利用する必要があります:それはプログラムで、私はすべてのhashmap.putのための新しい単一のarraylistオブジェクトを作成することはできません。私は確かに何かが不足している= |しかし、私は、arraylistの新しいインスタンスをtempに割り当てようとしましたが、その後、最後のものを除いて、ハッシュマップのすべてのarraylistがfalse値でいっぱいになりました。 – breathe0

答えて

1

その後、temp変数を再利用する必要があるので、 を再初期化する必要があります。私は以下の指示でそれを行います: for(BooleanWrap bool:temp) {bool.set(false); }

これは、temp変数を再初期化しません。これにより、の内容がの一時変数に再初期化されます。あなたのコードはBooleanWRapを使用し

ArrayList<BooleanWrap> temp=new ArrayList <BooleanWrap>(48); 
//cycle: operations to fill the ArrayList, then a condition is satisfied 

hashMap.put(index, temp); 

//After that, I have to reuse the temp variable, so I need to reinitialize it. 
// I do it with the following instructions: 

temp = new ArrayList <BooleanWrap>(48); 
//cycle: operations to fill the ArrayList 
+0

あなたのアドバイスに感謝しました。明らかに、配列リストの各項目を後で再作成する必要がありました(cicle:temp.add(i、新しいBoolean(false))。新しい48ブール演算子をより少ない命令でインスタンス化する別の方法があるとは思わない... am間違ってる? – breathe0

2

問題はではなく、の変数です。約のオブジェクトおよびの突然変異です。

したがって必要に応じて新しいオブジェクトを作成します。 「問題」は、元のオブジェクトが、に変異していることです。

しかし、変数の再利用を避けると、コードをより保守性と理解しやすくすることができます。

ハッピーコーディング。

1

ようになりますと再初期化temp変数でも、ブールは非効率的になり、非常に非効率的です。

代わりにBitSetを使用することをお勧めします。

BitSet temp = new BitSet(48); 

//cycle: operations to fill the ArrayList, then a condition is satisfied 

hashMap.put(index, temp); 

// to create a new BitSet... 
temp = new BitSet(48); 
関連する問題