Javaのリストadd(list)が空の問題
1628 ワード
参考博文
List呼び出しadd()メソッドが空解釈(qq_34250494の回答)
LeetCode 39をしています.Combination Sumでは再帰を使用しており、適切な条件でリストresultに結果を追加している.
ここで、getResult()メソッドに最後にarayListを追加すると、結果は空になりますがresultを使用すると問題が発生します.add(new ArrayList(list))は、正しい結果を返すことができます.このコードを使って説明したほうがいいです.
resの各要素はListタイプであり,変数リストを用いて参照するリストデータを指す.resに格納されるのもlistが指すデータです.
なぜ私が直面した問題でresultを巡ると空に戻るのかは、arrayListがメソッドのパラメータとしてメソッドの終了時にスタックフレームが回収され、そのすべての内容がローカル変数テーブルを含むことが有効ではないためです.だからresultが指すlistはすべて空です.
List呼び出しadd()メソッドが空解釈(qq_34250494の回答)
LeetCode 39をしています.Combination Sumでは再帰を使用しており、適切な条件でリストresultに結果を追加している.
class Solution {
public List> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
List> result = new ArrayList();
getResult(result, new ArrayList(), candidates, target, 0);
return result;
}
private void getResult(List> result, List arrayList, int[] candidates,
int target, int start) {
// TODO Auto-generated method stub
if(target > 0) {
for(int i = start; i < candidates.length;i ++) {
if(target >= candidates[i]) {
arrayList.add(candidates[i]);
getResult(result, arrayList, candidates, target - candidates[i], i);
arrayList.remove(arrayList.size() - 1);
}
}
}else if(target == 0) {
result.add(new ArrayList(arrayList));
}
}
}
ここで、getResult()メソッドに最後にarayListを追加すると、結果は空になりますがresultを使用すると問題が発生します.add(new ArrayList(list))は、正しい結果を返すことができます.このコードを使って説明したほうがいいです.
ArrayList list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List> res = new ArrayList<>();
System.out.println(res);
res.add(list);
list.add(50);
res.add(list);
System.out.println(res+" ");
resの各要素はListタイプであり,変数リストを用いて参照するリストデータを指す.resに格納されるのもlistが指すデータです.
なぜ私が直面した問題でresultを巡ると空に戻るのかは、arrayListがメソッドのパラメータとしてメソッドの終了時にスタックフレームが回収され、そのすべての内容がローカル変数テーブルを含むことが有効ではないためです.だからresultが指すlistはすべて空です.