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();
            }
        }
    }
}

从主函数多次调用此方法。最后,我尝试将类变量的内容写入文件。但是,当我这样做时,我得到 0 作为 inputTerms 的内容。但是,如果我删除了 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

当您添加“子句”时,您将实际对象添加到 arrayList,而不是副本。因此,当您清除它们时,列表中的所有值都将被删除。要解决这个问题,请添加列表的克隆:

inputTerms.add((ArrayList<Integer>) clauses.clone());
于 2012-09-04T15:58:40.667 回答
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 回答