通过引用在对象内复制2D数组

时间:2013-08-13 01:52:20

标签: java java-7

Object1.java:

public class Object1 {
    public double[][] var1;
    ...
}

Object2.java:

public class Object2 {
    public double[][] var2;
    ...
}

我想通过引用(浅拷贝)将Object2.var2复制到Object1.var1中。这是我正在尝试的,这是行不通的:

 Object1 object1 = new Object1();
 object1.var1 = new double[2][];
 System.arraycopy(object2.var2, 0, object1.var1, 0, object2.var2.length);

任何人都知道我哪里出错了?我收到java.lang.NullPointerException编译错误。请注意,object2.var2填充了数据。

更新1:

请注意,object2.var2是一个Nx2矩阵,如下所示:

object2.var2[0][0]=1.232
object2.var2[0][1]=23.233
object2.var2[1][0]=3.23
object2.var2[1][1]=32.12
...
object2.var2[N][0]=3.23
object2.var2[N][1]=32.12

当我尝试以下操作时,我也会看到java.lang.NullPointerException

object1.var1=new double[object2.var2.length][2];
object1.var1=object2.var2;

3 个答案:

答案 0 :(得分:2)

你说你想要一个浅色的副本,但看起来你有一半尝试深层复制。对于浅拷贝,您只需复制参考;没有必要的数组分配或复制:

object1.var1 = object2.var2;

示例:

public class Example {
    public static final void main (String[] args) {
        double[][] d = new double[10][10];
        double[][] e = d;    
        d[3][3] = 1.234;
        System.out.println(e[3][3]);
    }
}

输出为1.234

答案 1 :(得分:2)

即使在原始矩阵中,您正在分配数组的一个维度而不分配其他维度!

double var1 = new double [2] []; //还不够

将矩阵视为数组数组 - 您分配了数组数组,但没有分配内部数组本身。如果您希望第二个维度对于2x3矩阵为3,则需要:


for(int i=0 ; i < var1.length; i ++)
    var1[i]=new double[3]

现在你的矩阵被分配了。副本将以同样的方式进行。

将var1中的任意矩阵复制到var2,您可能需要:

var2=new double[var1.length][];

for(int i=0 ; i < var1.length; i ++)
{
    var2[i]=new double[var1[i]];
    System.arraycopy(object2.var2[i], 0, object1.var1[i], 0, object2.var2[i].length);
}

我不这么做,但我认为这很准确。

那说,通常有更好的方法。如果您要使用很多矩阵,您可能需要查看一些免费的外部库。

答案 2 :(得分:0)

    Object2 object2 = new Object2();    
    // you need to iniialize ur object2.var2 first
    object2.var2 = new double[][]{ {1.232, 23.233},{3.23,32.12},{3.23,32.12}};
    //or 
    object2.var2 = new double[3][2];
    object2.var2[0][0]=1.232;
    object2.var2[0][1]=23.233;
    object2.var2[1][0]=3.23;
    object2.var2[1][1]=32.12;
    object2.var2[2][0]=3.23;
    object2.var2[2][1]=32.12;

    System.out.println(object2.var2);
    Object1 object1 = new Object1();
    object1.var1= new double[object2.var2.length][2];
    System.out.println(object1.var1);
    System.arraycopy(object2.var2, 0, object1.var1, 0, object2.var2.length);