[英]Vector.clear() in Multidimensional Vectors
我正在編寫一個程序來在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
為什么會這樣?
問題在這里:
objectMatrix.addElement(objectVector);
System.out.println(objectMatrix.elementAt(0).size());
objectVector.clear();
請記住, objectVector
是一個引用 。 因此,當您調用objectMatrix.addElement(objectVector);
,您要objectMatrix
objectVector
的引用存儲到objectMatrix
。 該引用指向的實際對象尚未以任何方式被復制或更改。
因此,當您調用objectVector.clear()
,將清除objectVector
指向的對象,該對象也恰好是您最近添加到objectMatrix
。
為了解決這個問題,可以為while
循環的每次迭代分配一個new Vector()
,或者將objectVector()
的內容復制到new Vector()
然后再將其添加到objectMatrix
。
附帶說明一下,您可能應該使用ArrayList
而不是Vector
。 Vector
是一個遺留類,這些天幾乎不再需要使用。
您正在將objectVector添加到objectMatrix-很好。 然后,您正在清除objectVector,因此也已清除了副本objectMatrix的副本-不好。
為什么不在第一個while循環中實例化objectVector。 例如這樣:
lineReader = new Scanner(s.nextLine());
Vector<gridObject> objectVector = new Vector<gridObject>();
然后,您無需清除此內容。
更換
objectVector.clear()
與
objectVector = new Vector<gridObject>();
由於您已經將objectVector添加到objectMatrix中,因此在同一實例上調用clear也會在matrix中清除。 需要新的引用來放置新值。
同樣在下一行之后
objectVector.addElement(objectInstance);
新增一行
objectInstance = new gridObject();
每次在程序中,objectInstance的值都應該不同,否則它指向相同的引用。
建議:1.將Vector <>替換為List <>,這樣性能會更好。 2.在Java中,類名以大寫字母開頭。 請將gridObject更改為GridObject。
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.