2013-11-26 105 views
0

我想做一個對象向量的副本,以便我可以有一個修改的向量,但保持原始向量的原始形式。我使用下面的代碼。克隆的向量仍然被覆蓋

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 

回答

2

Vectorclone方法將證明克隆的名單,但裏面的內容將保持不變。你也必須克隆這些元素。

+0

我沒有看到任何單個元素的克隆方法。但是我描述了我最終使用的解決方案,我在這裏單獨處理元素。不過,我需要編寫一個函數,在原語級別執行復制操作,以便複製值。謝謝。 – OtagoHarbour

3

使用clone()方法的問題是,它執行淺拷貝而不是深拷貝。因此,即使克隆了Vector實例,它也不會克隆其內部引用指向的對象。它只是複製參考。

執行深度複製的最佳方法是使用序列化和反序列化。查看this article瞭解一些細節和示例實現。

+0

我嘗試使用序列化,如文章中的示例所示,並編輯了我的問題以顯示我的方法和結果。 oos.writeObject(delaunayTriangles);返回了「不可序列化」的異常。謝謝。 – OtagoHarbour

+0

@OtagoHarbour你的類'Triangle_dt'應該實現'Serializable'接口。 –

0

我想出了一種可行的方法。

static Triangle_dt CopyOfTriangle(Triangle_dt oldTriangle){ 
    Point_dt[] points=new Point_dt[3]; 

    try{ 
     points[0]=new Point_dt(oldTriangle.p1().x(), oldTriangle.p1().y()); 
     points[1]=new Point_dt(oldTriangle.p2().x(), oldTriangle.p2().y()); 
     points[2]=new Point_dt(oldTriangle.p3().x(), oldTriangle.p3().y()); 

     return new Triangle_dt(points[0], points[1], points[2]); 
    } 
    catch(Exception e){ 
     System.out.println("Exception in CopyOfTriangle = " + e); 
     throw(e); 
    } 
} 

static Vector<Triangle_dt> GetDelaunayTriangulationDisplayTriangles(Vector<Triangle_dt> delaunayTriangles, 
      BoundingBox boundingBox){ 
    try{ 
     Vector<Triangle_dt> displayTriangles=new Vector<Triangle_dt>(); 
     if (boundingBox.maxY()>=768){ 
      double scale=767.0/boundingBox.maxY(); 
      Triangle_dt newTriangle, oldTriangle; 
      for (int i=0; i<delaunayTriangles.size(); ++i){ 
       oldTriangle=delaunayTriangles.elementAt(i); 
       if (oldTriangle.p3()!=null){ 
        newTriangle=CopyOfTriangle(oldTriangle); 
        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); 
        displayTriangles.add(newTriangle); 
       } 
      } 
     } 

     return displayTriangles; 
    } 
    catch(Exception e){ 
     System.out.println("Exception in GetDelaunayTriangulationDisplayTriangles = " + e); 
     throw(e); 
    } 
} 
+0

與C/C++相比似乎很複雜。 – OtagoHarbour