数组被覆盖没有明显的原因

时间:2013-04-01 15:07:42

标签: java android

问题

<小时/> 我写了一个循环,在其中我用Sum对象填充数组。一切正常,但是一旦循环进入下一次迭代,它就会覆盖数组的第一个索引。


我尝试了什么

<小时/> 我试着看看我的问题是否存在于另一段代码中(例如我的Sum类)。但找不到任何会扰乱循环的东西 我试图找到具有相同名称的其他变量(即使在其他方法中,因为我绝望)并且看看我是否可能在其他地方更改了我的迭代器。我找不到任何相关的东西。
我试着在互联网上四处搜索,以找到与意外覆盖数组相关的内容但却找不到任何内容。


代码


public Task(Object[] parameters)
{
    this.number_of_sums = Integer.parseInt((String)parameters[0]);
    this.variables_per_sum = Integer.parseInt((String)parameters[1]);
    this.sum_parameters = new Object[this.variables_per_sum];
    this.sums = new Sum[this.number_of_sums];
    int z = 0;

    for(int i = 0; i < this.number_of_sums; i++)
    {
        int x = 0;
        for(int j = (2 + z); j < ((this.variables_per_sum + 2) + z); j++)
        {
            this.sum_parameters[x] = parameters[j];
            x++;
        }

        this.sums[i] = new Sum(this.sum_parameters);

        System.out.println("Index 0: "+sums[0]); //1st iteration: 1 + 1 //2nd iteration: 2 - 1
        System.out.println("Index 1: "+sums[1]); //1st iteration: null //2nd iteration: 2 - 1

        z += this.variables_per_sum;
    }
}


期望

<小时/> 我期待输出1 + 1和2 - 1.然而我得到以下内容:2 - 1和2 - 1,当我完成。

如果有人发现任何我做错了或希望在我身边看到更多信息或代码,请说明。提前谢谢。

2 个答案:

答案 0 :(得分:3)

我将假设Sum类不存储它的总和,而是在需要的时候从它构造的数组中计算它。

看起来所有Sum个对象都将共享同一个数组 - 每次构造Sum时都会传递相同的引用。此外,每次循环j时,都会覆盖该数组的内容。

所以当一切都完成后,所有的总和都是一样的。

您应该能够通过为每个Sum提供不同的sum_parameters来解决这个问题:

public Task(Object[] parameters)
{
    this.number_of_sums = Integer.parseInt((String)parameters[0]);
    this.variables_per_sum = Integer.parseInt((String)parameters[1]);
    this.sums = new Sum[this.number_of_sums];
    int z = 0;

    for(int i = 0; i < this.number_of_sums; i++)
    {
        Object[] sum_parameters = new Object[this.variables_per_sum];
        int x = 0;
        for(int j = (2 + z); j < ((this.variables_per_sum + 2) + z); j++)
        {
            sum_parameters[x] = parameters[j];
            x++;
        }

        this.sums[i] = new Sum(sum_parameters);

        System.out.println("Index 0: "+sums[0]); //1st iteration: 1 + 1 //2nd iteration: 2 - 1
        System.out.println("Index 1: "+sums[1]); //1st iteration: null //2nd iteration: 2 - 1

        z += this.variables_per_sum;
    }
}

答案 1 :(得分:1)

每个Sum个对象都是以this.sum_parameters作为参数构建的:

this.sums[i] = new Sum(this.sum_parameters);

在外部循环的每次迭代中修改sum_parameters时,它会在围绕引用的周围构建的对象内部发生变化。

您应在每个sum_parameters对象中制作Sum的内部副本。