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;
答案 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);