ArrayLists的ArrayList - 清除函数混淆

时间:2012-09-04 15:44:01

标签: java

这是我写的一种特殊方法:

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

4 个答案:

答案 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());
相关问题