类覆盖的数组

时间:2016-01-14 10:27:23

标签: java arrays

当我创建类的数组时,前一个类的每个元素都被下一个类元素覆盖。

我的班级:

public class Perceptron2 {

    public double prog=0.01;
    public double wagi[]=new double[35];
    public double blad;
    public double stala=0.001;
    public Perceptron2(double prog, double[] wagi, double blad) {
        this.prog = prog;
        this.wagi = wagi;
        this.blad = blad;
        stala=0.001;
    }
    public double getProg() {
        return prog;
    }
    public void setProg(double prog) {
        this.prog = prog;
    }

    public double[] getWagi() {
        return wagi;
    }

    public void setWagi(double[] wagi) {
        this.wagi = wagi;
    }

    public double getBlad() {
        return blad;
    }

    public void setBlad(double blad) {
        this.blad = blad;
    }

    public double getStala() {
        return stala;
    }

    public void setStala(double stala) {
        this.stala = stala;
    }

}

以下代码

public class runn {
    public static void main(String[] args) {
        Random random = new Random();
        double [] wagi = new double[35];
        double prog = 0.01;     
        Perceptron2[] p = new Perceptron2[10];
        System.out.println(p.length);
        for (int i=0;i<p.length;i++)
        {
            for(int j=0; j<35; j++) 
            {
                wagi[j]=random.nextDouble()*0.1;
            }
            System.out.println(i+" "+wagi[1]);
            p[i] = new Perceptron2 (prog, wagi , 0.01);
        }
        System.out.println(p[3].wagi[1]);
        System.out.println(p[4].wagi[1]);
    }
}

例如p [3] .wagi [1]和p [4] .wagi [1]相等。如何使它们与众不同?

3 个答案:

答案 0 :(得分:2)

对象(包括数组)在Java中作为指针传递,而不是作为其内容的副本传递。

您需要为外循环的每次迭代创建一个wagi的新实例。

实际上,你将wagi填入每个Perceptron2(我从未想过要写的另一句话)。

所以要么

for (int i=0;i<p.length;i++){
   double [] wagi = new double[35];
   for(int j=0; j<35; j++) {

或在Perceptron2构造函数中制作数组的防御副本:

this.wagi = Arrays.copyOf(wagi, wagi.length);

答案 1 :(得分:0)

进入main方法,更改此行:

p[i] = new Perceptron2 (prog, new double[35], 0.01);

把它放在循环的开头。在循环中,通过执行以下操作将值设置在数组中的正确位置:

 p[i].wagi[j]=random.nextDouble()*0.1;

您的问题是由于每个Perceptron对象使用相同的wagi实例。

答案 2 :(得分:0)

在&#34; runn.class&#34;中删除此行,

double [] wagi = new double[35];

并将其置于外部for循环之下

for (int i=0;i<p.length;i++)
    {
        double [] wagi = new double[35];
        for(int j=0; j<35; j++) 
        {
            wagi[j]=random.nextDouble()*0.1;
        }
        System.out.println(i+" "+wagi[1]);
        p[i] = new Perceptron2 (prog, wagi , 0.01);
    }