这是我写的一种特殊方法:
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();
}
}
}
}
从main函数多次调用此方法。 最后,我尝试将类变量的内容写入文件。但是,当我这样做时,我得到0作为inputTerms的内容。但是,如果我删除clauses.clear()行,我可以获得适当的值。
我的程序是这样的,在添加到inputTerms之后清除子句是至关重要的。有没有替代方案?
**嗯..我已经完成了你的建议。但是,我还没有完全克服这个问题。为了给出更多背景知识,在我的main函数中,我有以下代码:
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
答案 0 :(得分: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)));
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
我不确定我是否理解你想要实现的目标,但你不断重复使用相同的列表,这可能不是你想要做的。
您可能应该在内循环中移动ArrayList<Integer> clauses = new ArrayList<Integer>();
,而不是根本调用clauses.clear()
。
答案 3 :(得分:0)
当您添加“子句”时,您将实际对象添加到arrayList,而不是副本。因此,当您清除它们时,列表中的所有值都将被删除。要获得这个,请添加列表的克隆:
inputTerms.add((ArrayList<Integer>) clauses.clone());