1

ここに私が書いた特定の方法があります:

class A {

    private static ArrayList<ArrayList<Integer>> inputTerms = new ArrayList<ArrayList<Integer>();

    public static void method1(ArrayList<Integer> terms) {
        ArrayList<Integer> clauses = new ArrayList<Integer>();
        int N = terms.size();
        for (int i = 0; i < N - 1; i++) {
            for (int j = i + 1; j < N; j++) {
                clauses.add(-terms.get(i));
                clauses.add(-terms.get(j));
                inputTerms.add(clauses);
                clauses.clear();
            }
        }
    }
}

このメソッドは、メイン関数から複数回呼び出されます。最後に、クラス変数の内容をファイルに書き込もうとします。しかし、これを行うと、inputTerms の内容として 0 を取得します。ただし、clauses.clear() 行を削除すると、適切な値を取得できます。

私のプログラムは、inputTerms に追加した後に句をクリアすることが不可欠です。これに代わるものはありますか?

**うーん..私はあなたが提案したことをしました。しかし、私はその問題を完全に克服していません。背景を詳しく説明するために、メイン関数には次のコードがあります。

for (int i=0; i<N-1; i++){ 
ArrayList<Integer> firstdiagonalTerms = new ArrayList<Integer>(); 
for (int j=0; j<N-i; j++){ 
firstdiagonalTerms.add(variable[j][i+j]); 
} 
method1(firstdiagonalTerms);
} 

「i」と「j」のさまざまな組み合わせに対して、method1 関数を 4 回呼び出す必要があります。ただし、上記の提案を使用しても0になります**

4

4 に答える 4

2

同じリストを追加して、繰り返しクリアしています。オブジェクトをリストに追加すると、オブジェクトのコピーではなく、そのオブジェクトへの参照がコピーされます。

int N = terms.size();
for (int i = 0; i < N - 1; i++) {
    for (int j = i + 1; j < N; j++) {
        List<Integer> clauses = new ArrayList<Integer>();
        clauses.add(-terms.get(i));
        clauses.add(-terms.get(j));
        inputTerms.add(clauses);
    }
}

また

for (int i = 0, N = terms.size(); i < N - 1; i++) 
    for (int j = i + 1; j < N; j++) 
        inputTerms.add(Arrays.asList(-terms.get(i), -terms.get(j)));
于 2012-09-04T15:49:09.340 に答える
0

あなたが何を達成しようとしているのかわかりませんが、同じリストを再利用し続けています。これはおそらくあなたが意図したことではありません。

ArrayList<Integer> clauses = new ArrayList<Integer>();おそらく、内側のループの内側に移動する必要があり、まったく呼び出さないclauses.clear()でください。

于 2012-09-04T15:48:53.187 に答える
0

リストで clear() を呼び出すと、同じオブジェクトを更新/削除しています (リストにはオブジェクトのコピーではなく、オブジェクトへの参照が含まれているため)。それが問題の原因です。

以下のようなことをする必要があると思います。clear() を使用する代わりに、毎回新しいリストを作成します。

public static void method1 (ArrayList<Integer> terms)
{

int N = terms.size();       
        for (int i = 0; i<N-1; i++) {
            for (int j=i+1; j<N; j++) {
              ArrayList<Integer> clauses = new ArrayList<Integer>();
              clauses.add(-terms.get(i));
              clauses.add(-terms.get(j));
              inputTerms.add(clauses);

}
}
于 2012-09-04T15:45:19.183 に答える
0

「節」を追加するときは、コピーではなく、実際のオブジェクトを arrayList に追加します。したがって、それらをクリアすると、リスト内のすべての値が削除されます。これを回避するには、リストのクローンを追加します。

inputTerms.add((ArrayList<Integer>) clauses.clone());
于 2012-09-04T15:58:40.667 に答える