为什么列表或数组在 'for' 循环的每次迭代中完全被一个对象的副本填充?
Why is list or array filled completely with duplicates of one object in each iteration of 'for' loop?
(事实证明,这里的代码是多余的,问题可以更短一些,正如 John Kugelamn 的第一个答案中所见。这都是关于创建对象而不是对它们的引用。)
我完全不知所措。看起来 for() 循环疯了。或者只有我去...
据我所知,它必须迭代地、一步一步地做某事,但看起来所有的迭代都是同时进行的。
代码如下:
static ArrayList<float[][]> carCrd = new ArrayList<float[][]>();
String[] sarr = {"train", "\"train::car_1::chassis\"",
"\"train::car_2::chassis\"", "\"train::car_3::chassis\"",
"\"train::car_4::chassis\"", "\"train::car_5::chassis\"" };
//function for parsing some big String into a list of
//phys. coordinates (loc and rot) for each model in sarr
ArrayList<float[][]> parse(. . .){
float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};
CoordTrack.carCrd.clear();
carCrd.ensureCapacity(sarr.length);
//for each String (model) in sarr parse corresp. coordinates:
for(String par: sarr){
sc = new Scanner(. . .);
loc[0] = Float.valueOf(sc.next());
. . .
rot[3] = Float.valueOf(sc.next());
sc.close();
//let's print loc and rot for each iteration to see that they're
//correctly different:
System.out.println("x: " + loc[0] + " y: " + loc[1] + " z: " + loc[2]);
System.out.println("x: " + rot[0] + " y: " + rot[1] + " z: " +
rot[2] + " w: " + rot[3]);
//append the resulting List
CoordTrack.carCrd.add(new float[][] { loc, rot });
//now let's print the size of the list and it whole
//in each 'for' iteration:
System.out.print(carCrd.size());
for(float[][] sar: carCrd){
System.out.println("x: " + sar[0][0] + " y: " + sar[0][1] +
" z: " + sar[0][2]);
System.out.println("x: " + sar[1][0] + " y: " + sar[1][1] +
" z: " + sar[1][2] + " w: " + sar[1][3]);
System.out.print("");
}
}
return(carCrd);
}
函数给出了这个输出:
x: 5.6086507 y: 96.49017 z: 4.2678218E-7
x: 7.454923E-7 y: -1.9659414E-7 z: -0.9956668 w: 0.092992336
1
x: 5.6086507 y: 96.49017 z: 4.2678218E-7
x: 7.454923E-7 y: -1.9659414E-7 z: -0.9956668 w: 0.092992336
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0
2
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
3
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
4
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
5
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
6
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
正如我们所见,每次列表都没有附加而是被完全覆盖。
实际上,当我在 for() 中使用 int index 进行迭代时,当我不使用 List 而使用数组时,我得到了相同的结果。
为什么?
或
谁疯了?..
float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};
...
CoordTrack.carCrd.add(new float[][] { loc, rot });
您一遍又一遍地添加相同的两个数组 loc
和 rot
。 new float[][]
不会创建这些数组的 copy,而是对它们使用 references。 carCrd
中的每个条目都引用相同的两个数组。
每次创建二维数组时都需要显式复制 float
值。
(事实证明,这里的代码是多余的,问题可以更短一些,正如 John Kugelamn 的第一个答案中所见。这都是关于创建对象而不是对它们的引用。)
我完全不知所措。看起来 for() 循环疯了。或者只有我去...
据我所知,它必须迭代地、一步一步地做某事,但看起来所有的迭代都是同时进行的。
代码如下:
static ArrayList<float[][]> carCrd = new ArrayList<float[][]>();
String[] sarr = {"train", "\"train::car_1::chassis\"",
"\"train::car_2::chassis\"", "\"train::car_3::chassis\"",
"\"train::car_4::chassis\"", "\"train::car_5::chassis\"" };
//function for parsing some big String into a list of
//phys. coordinates (loc and rot) for each model in sarr
ArrayList<float[][]> parse(. . .){
float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};
CoordTrack.carCrd.clear();
carCrd.ensureCapacity(sarr.length);
//for each String (model) in sarr parse corresp. coordinates:
for(String par: sarr){
sc = new Scanner(. . .);
loc[0] = Float.valueOf(sc.next());
. . .
rot[3] = Float.valueOf(sc.next());
sc.close();
//let's print loc and rot for each iteration to see that they're
//correctly different:
System.out.println("x: " + loc[0] + " y: " + loc[1] + " z: " + loc[2]);
System.out.println("x: " + rot[0] + " y: " + rot[1] + " z: " +
rot[2] + " w: " + rot[3]);
//append the resulting List
CoordTrack.carCrd.add(new float[][] { loc, rot });
//now let's print the size of the list and it whole
//in each 'for' iteration:
System.out.print(carCrd.size());
for(float[][] sar: carCrd){
System.out.println("x: " + sar[0][0] + " y: " + sar[0][1] +
" z: " + sar[0][2]);
System.out.println("x: " + sar[1][0] + " y: " + sar[1][1] +
" z: " + sar[1][2] + " w: " + sar[1][3]);
System.out.print("");
}
}
return(carCrd);
}
函数给出了这个输出:
x: 5.6086507 y: 96.49017 z: 4.2678218E-7
x: 7.454923E-7 y: -1.9659414E-7 z: -0.9956668 w: 0.092992336
1
x: 5.6086507 y: 96.49017 z: 4.2678218E-7
x: 7.454923E-7 y: -1.9659414E-7 z: -0.9956668 w: 0.092992336
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0
2
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0
x: 0.0 y: 0.0 z: 0.1
x: 0.0 y: 0.0 z: 0.0 w: 1.0
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
3
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.13724202 y: -0.584103 z: 0.100000165
x: -5.220888E-7 y: -8.881327E-7 z: -0.062116615 w: 0.99806887
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
4
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.16923165 y: -1.1832443 z: 0.10000184
x: -3.4203006E-7 y: -1.3052559E-6 z: 0.16753982 w: 0.9858653
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
5
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 0.4568624 y: -1.7098008 z: 0.100002564
x: 3.1865994E-7 y: -2.2401466E-6 z: 0.48815113 w: 0.8727591
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
6
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
x: 1.0100093 y: -1.9422312 z: 0.100003526
x: 3.6465533E-8 y: -1.9686745E-6 z: 0.7412199 w: 0.6712623
正如我们所见,每次列表都没有附加而是被完全覆盖。 实际上,当我在 for() 中使用 int index 进行迭代时,当我不使用 List 而使用数组时,我得到了相同的结果。 为什么?
或
谁疯了?..
float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};
...
CoordTrack.carCrd.add(new float[][] { loc, rot });
您一遍又一遍地添加相同的两个数组 loc
和 rot
。 new float[][]
不会创建这些数组的 copy,而是对它们使用 references。 carCrd
中的每个条目都引用相同的两个数组。
每次创建二维数组时都需要显式复制 float
值。