我正在制作一个程序来读取和转换文本文件到eclipse中自定义对象的2D矢量,但似乎每当我在1D矢量上调用Vector.clear()时,它也会删除2D中的相应元素向量。为什么会发生这种情况,我该如何解决这个问题?另外,请记住我是java的初学者。
public Vector<Vector<gridObject>> copyToVector(Scanner s){
//main instantiation
Scanner lineReader = null;
gridObject objectInstance = new gridObject();
objectInstance.w = 10;
objectInstance.h = 10;
Vector<gridObject> objectVector = new Vector<gridObject>();
Vector<Vector<gridObject>> objectMatrix = new Vector<Vector<gridObject>>();
int rowNumber = 0;
int columnNumber = 0;
//reads next line break
while(s.hasNextLine()){
lineReader = new Scanner(s.nextLine());
rowNumber++;
//reads next character
while(lineReader.hasNext()){
columnNumber++;
//decides what object the character represents
switch(lineReader.next()){
case "0":
objectInstance.x = 10*(columnNumber-1);
objectInstance.y = 10*(rowNumber - 1);
objectInstance.id = 0;
break;
case "1":
objectInstance.x = 10*(columnNumber-1);
objectInstance.y = 10*(rowNumber - 1);
objectInstance.id = 1;
break;
default:
objectInstance.x = 10*(columnNumber-1);
objectInstance.y = 10*(rowNumber - 1);
objectInstance.id = -1;
break;
}
objectVector.addElement(objectInstance);
}
objectMatrix.addElement(objectVector);
System.out.println(objectMatrix.elementAt(0).size());
objectVector.clear();
System.out.println(objectMatrix.elementAt(0).size());
columnNumber = 0;
}
lineReader.close();
return objectMatrix;
}
此函数正在读取的文件是一个由0组成的简单txt文件
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
输出是这样的:
10
0
10
0
10
0
为什么会这样?
答案 0 :(得分:0)
问题在于:
objectMatrix.addElement(objectVector);
System.out.println(objectMatrix.elementAt(0).size());
objectVector.clear();
请注意,objectVector
是参考。因此,当您致电objectMatrix.addElement(objectVector);
时,您将参考存储到objectVector
objectMatrix
。该参考指向的实际对象未以任何方式被复制或更改。
因此,当您致电objectVector.clear()
时,您会清除objectVector
指向的对象,这也恰好是您最近添加到objectMatrix
的参考对象。
要解决此问题,请为new Vector()
循环的每次迭代分配while
,或将objectVector()
的内容复制到new Vector()
,然后再将其添加到{{1} }}
另外,您可能应该使用objectMatrix
代替ArrayList
。 Vector
是一个遗留类,这些日子几乎不需要使用。
答案 1 :(得分:0)
您正在将objectVector添加到objectMatrix中 - 很好。 然后你正在清除objectVector,所以复制objectMatrix现在已经被清除了 - 不是很好。
为什么不在第一个while循环中实例化objectVector。例如像这样:
lineReader = new Scanner(s.nextLine());
Vector<gridObject> objectVector = new Vector<gridObject>();
然后你不需要清除它。
答案 2 :(得分:0)
替换
objectVector.clear()
与
objectVector = new Vector<gridObject>();
由于您已经将objectVector添加到objectMatrix,因此在同一实例上调用clear也将在矩阵内清除。需要新的参考来放置新值。
也紧接在以下一行
之后objectVector.addElement(objectInstance);
添加新行
objectInstance = new gridObject();
每次在程序中,对象值的objectInstance应该不同,否则它指向相同的引用。
建议: 1.替换Vector&lt;&gt;与列表&lt;&gt;哪个性能更好。 2.在java中,类名以大写的第一个字母开头。请将gridObject更改为GridObject。
此致