1

问题


我编写了一个循环,在其中我用 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。

如果有人发现我做错了什么,或者想在我身边看到更多信息或代码,请说出来。提前致谢。

4

2 回答 2

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;
    }
}
于 2013-04-01T15:24:13.840 回答
1

您的每个Sum对象都this.sum_parameters作为参数构造:

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

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

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

于 2013-04-01T15:20:03.893 回答