2016-07-20 7 views
0

問題が発生しました。私は、次のコードで一時を変更しようとしながら、結果は(私は結果に何もしなかった)に更新される:新しいオペレータを使用すると元のArrayListが変更されます

List<List<Integer>> result = new ArrayList<>(); 
result.add(new ArrayList<>()); 
List<List<Integer>> temp = new ArrayList<>(); 
for (List<Integer> list: result) { 
    list.add(10000); 
    temp.add(new ArrayList(list)); 
} 

結果は[[10000]]などであることが判明した理由を私は知りません一時的なtemp.add(new ArrayList(list))のようなaddメソッドに何か問題はありますか?

答えて

0

コードは、書かれているように1回のみループします。のは、見てみましょう:

List<List<Integer>> result = new ArrayList<>(); 
result.add(new ArrayList<>()); 

これは、要素List<Integer>あるList、あるresultを、初期化します。結果に1つの要素を追加すると、resultは単一要素のリストになります。その1つの要素自体がゼロ要素リストです。ここで

List<List<Integer>> temp = new ArrayList<>(); 

、あなたはまた、その要素型としてList<Integer>を含むListするtempを初期化しますが、それは空です。

for (List<Integer> list: result) { 
    list.add(10000); 
    temp.add(new ArrayList(list)); 
} 

ここで、resultには1つの要素しかありません。その1つの要素は、あなたが2行目に与えたもので、result.add(new ArrayList<>());です。このループはresultの各要素を繰り返し処理します。resultには1つの要素しかないため、ループは1回だけループします。

この場合、resultの最初の要素は、空のリストではなく10000のリストに更新されます。したがってresultはまだシングルトンリストになりますが、その1つの要素は10000を含むシングルトンリストになります。

temp.add(new ArrayList(list))を呼び出します。 new ArrayList(list)を呼び出すと、listのすべての要素を含むArrayListが作成されます。あなたがそれを呼び出すと、list10000を含むシングルトンなので、new ArrayList(list)も数字10000を含むシングルトンです。次に、ArrayListtempに追加します。これは以前は空のリストでした。現在、tempはシングルトンであり、その1つの要素は10000を含むシングルトンリストです。

この時点で、resulttempはどちらも正確に1つの要素を含むリストであり、それぞれ正確に1つの要素を含むリストであり、番号は10000です。そのため、とtempの値は[[10000]]です。[10000]は数字が10000のリストで、[[10000]]のリストはちょうど[10000]のリストです。

関連する問題