Java 为什么在';对于';环
(事实证明,这里的代码是多余的,问题可以缩短,正如John Kugelamn的第一个答案所示。这都是关于创建对象的,而不是对它们的引用。) 我完全不知所措。看来for()循环已经疯了。或者只是我去 据我所知,它必须一步一步地完成某件事,但看起来所有的迭代都是同时进行的 代码如下:Java 为什么在';对于';环,java,arraylist,reference,Java,Arraylist,Reference,(事实证明,这里的代码是多余的,问题可以缩短,正如John Kugelamn的第一个答案所示。这都是关于创建对象的,而不是对它们的引用。) 我完全不知所措。看来for()循环已经疯了。或者只是我去 据我所知,它必须一步一步地完成某件事,但看起来所有的迭代都是同时进行的 代码如下: static ArrayList<float[][]> carCrd = new ArrayList<float[][]>(); String[] sarr = {"train", "\"tra
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);
}
正如我们所看到的,每次列表都不会被追加,而是被完全覆盖。
实际上,当我在for()中使用int index进行迭代时,当我使用数组而不是列表时,我得到了相同的结果。
为什么?
或
谁疯了
float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};
...
CoordTrack.carCrd.add(new float[][] { loc, rot });
您一次又一次地添加相同的两个数组loc
和rot
newfloat[][]
不创建这些数组的副本,而是使用对它们的引用。carCrd
中的每个条目都引用相同的两个数组
每次创建二维数组时,您都需要显式复制
浮点值。为什么使用静态列表?您能发布一个我们可以自己编译和运行的列表吗?如果你能编辑出…
并使其成为一个完整的、自包含的程序,那会有很大帮助。@JohnKugelman我想,从你下面的回答来看,有足够甚至多余的信息)此外,我使用Gazebo和我自己的环境设置来模拟动画,所以你几乎无法启动动画program@alexey,您可以使用CoordTrack.carCrd.add(newfloat[][{loc.clone(),rot.clone()})
要将新数组添加到列表中
@msandiford和JohnKugelman感谢您的快速回复,我稍后会检查它们,现在在Msk这里是凌晨3:30,这不是最好的时间。)我想我现在理解了这个问题。您知道Java中引用和副本的详细信息在哪里有更深入的解释吗?关于clone()方法的建议很有效,谢谢!
float[] loc = {0, 0, 0};
float[] rot = {0, 0, 0, 0};
...
CoordTrack.carCrd.add(new float[][] { loc, rot });