我想做一個對象向量的副本,以便我可以有一個修改的向量,但保持原始向量的原始形式。我使用下面的代碼。克隆的向量仍然被覆蓋
Vector<Triangle_dt> displayTriangles=(Vector)delaunayTriangles.clone();
if (boundingBox.maxY()>=768){
double scale=767.0/boundingBox.maxY();
Triangle_dt newTriangle, oldTriangle;
for (int i=0; i<delaunayTriangles.size(); ++i){
newTriangle=displayTriangles.elementAt(i);
oldTriangle=delaunayTriangles.elementAt(i);
newTriangle.p1().setX(oldTriangle.p1().x()*scale);
newTriangle.p1().setY(oldTriangle.p1().y()*scale);
newTriangle.p2().setX(oldTriangle.p2().x()*scale);
newTriangle.p2().setY(oldTriangle.p2().y()*scale);
newTriangle.p3().setX(oldTriangle.p2().x()*scale);
newTriangle.p3().setY(oldTriangle.p2().y()*scale);
}
}
當我更改新矢量時,舊矢量被覆蓋。我認爲.clone()的想法是通過值而不是通過引用來複制向量。
編輯:我試着修改代碼以使用序列化進行深度複製。代碼如下。
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
// serialize and pass the object
oos.writeObject(delaunayTriangles);
oos.flush();
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bin);
// return the new object
Vector<Triangle_dt> displayTriangles = (Vector<Triangle_dt>)ois.readObject();
if (boundingBox.maxY()>=768){
double scale=767.0/boundingBox.maxY();
Triangle_dt newTriangle, oldTriangle;
for (int i=0; i<delaunayTriangles.size(); ++i){
newTriangle=displayTriangles.elementAt(i);
oldTriangle=delaunayTriangles.elementAt(i);
newTriangle.p1().setX(oldTriangle.p1().x()*scale);
newTriangle.p1().setY(oldTriangle.p1().y()*scale);
newTriangle.p2().setX(oldTriangle.p2().x()*scale);
newTriangle.p2().setY(oldTriangle.p2().y()*scale);
newTriangle.p3().setX(oldTriangle.p2().x()*scale);
newTriangle.p3().setY(oldTriangle.p2().y()*scale);
}
}
return displayTriangles;
}
catch(Exception e)
{
System.out.println("Exception in ObjectCloner = " + e);
throw(e);
}
finally
{
oos.close();
ois.close();
}
但是通話
oos.writeObject(delaunayTriangles);
通過異常
e = (java.io.NotSerializableException) java.io.NotSerializableException: delaunay_triangulation.Triangle_dt
我沒有看到任何單個元素的克隆方法。但是我描述了我最終使用的解決方案,我在這裏單獨處理元素。不過,我需要編寫一個函數,在原語級別執行復制操作,以便複製值。謝謝。 – OtagoHarbour