0

对象1.java:

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

对象2.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;
4

3 回答 3

2

You say you want a shallow copy, but it looks like you are half attempting a deep copy. For a shallow copy, all you have to do is copy the reference; no array allocation or copying necessary:

object1.var1 = object2.var2;

Example:

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]);
    }
}

Output is 1.234.

于 2013-08-13T01:55:47.363 回答
2

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

双变量1=新双[2][];//还不够

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

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

现在您的矩阵已分配。副本会以几乎相同的方式进行。

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

var2=新双[var1.length][];

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

我做的不多,但我认为这是非常准确的。

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

于 2013-08-13T01:57:11.817 回答
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);
于 2013-08-13T03:04:00.920 回答