2013-09-11 42 views
1

我想複製Vector包含以下結構的重要性和對我來說是保持原來的Vector完好,當我修改複製的一個:保持原始Vector完好當修改它的副本

public class objet_poid_n { 
    public int Num; 
    public double Poid; 
         } 

以爲我們有:

Vector original = new Vector(); 
original = filled((Vector) original); // function fills original with many objet_poid_n elements 
Vector destination = new Vector(); 

我想:

destination = original ; 

destination = original.clone(); 

destination.setSize(original.size()); 
Collections.copy(destination,original); 

destination.addAll((Vector) original); 

destination.copyInto((Vector) original); 

不幸的是,所有這些方法,我用讓我總是同樣的問題! 無論我修改目的地!!!原來的一個也被修改了!!!!!! 請任何想法!這讓我瘋狂 !我不明白爲什麼!因爲3天

Vector copy=new Vector((Vector) allPopulation.get(0)); 
     for(int j=0;j<100;j++){ 
      System.out.println("--------------------iteration num :"+(j+1)+"----------------------"); 
      System.out.println("sol 1 ------->"); 
      affiche_resultat((Vector) allPopulation.get(0)); \\ affiche_result to print the containing of the vector just for test 



      System.out.println("Copy -------->"); 
      affiche_resultat(copy); 

      Vector muted = new Vector(); 
      muted = mutation(copy); 
      System.out.println("Mutated ----------->"); 
      affiche_resultat(muted); 
      System.out.println();} 


    }  

變異函數爲..現在我堅持:

private Vector mutation(Vector son1){ 
     Vector topac = new Vector(); // à remplir par les objet qu'on va supprimer 
     // dégager les null     
    Vector son = new Vector(son1); 

     son.removeAll(Collections.singleton(null)); 
     int j=0,i=0; 
     boolean remove = (Math.random() > 0.3) ; // probabilité d'avoir true = 0.7 
      for(i=0;i<son.size();i++){ 
      remove = (Math.random() > 0.3); 
         System.out.println(" remove ="+remove); 

      if((remove == true) && (son.get(i) != null)){ 
      Capaciter_n_objet bin =(Capaciter_n_objet) son.get(i); 
      Vector objetlist=bin.n_objet; 
      for(j=0;j<objetlist.size();j++) 
        { 
       int del =(int) Integer.parseInt(""+objetlist.get(j)); 
       topac.add(new Integer(del));      
         } 
      topac.removeAll(Collections.singleton(null)); 
      //son.removeElementAt(i); 
      son.setElementAt(null, i); 
      } 
      }      
     son.removeAll(Collections.singleton(null)); 
     topac.removeAll(Collections.singleton(null)); 
     Collection noDup = new LinkedHashSet(topac); //remove duplications 
     topac.clear(); 
     topac.addAll(noDup); 
     correctionmutation(son,topac); 
      return son; 
}        
+3

1.不要使用[原始類型](http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html)。 2. [不要使用'Vector'](http://stackoverflow.com/questions/1386275/why-is-java-vector-class-considered-obsolete-or-deprecated) - 使用類似'ArrayList'的東西。 – arshajii

+0

現在我正在修復我的項目程序中的最後一點,我從一個月開始它..我開始與矢量..不,我不能移回來,改變處理ArrayList除了我不知道如何使用它們.. –

+0

您應該發佈修改元素的代碼,以演示實際問題 - 因爲不清楚「保持原始完整」的意思以及您在副本上做什麼「修改」 –

回答

0

最後,我從我的一個朋友那裏得到了解決方案,最近,我發現如果我們使用包含Data StructClass元素的Vector,我上面提到的所有類型的副本總是會導致淺拷貝
因此,解決方案是創建一個拷貝構造函數或函數來使深拷貝,所提出的功能,我們現在已經得到的是:

public Vector copi(Vector copy){ 
     Vector callp=new Vector(); 
     for(int i=0;i<copy.size();i++){ 
       copy.removeAll(Collections.singleton(null)); 
       Capaciter_n_objet cno1=null,cno=(Capaciter_n_objet) copy.get(i); 
       cno1=new Capaciter_n_objet(); 
       cno1.capaiter_rest=cno.capaiter_rest; 
       cno1.n_objet= (Vector) cno.n_objet.clone(); 
       callp.add(cno1); 
      }  
return callp;   
} 

而且thanx的所有您的建議和想法:)

0

你需要做深克隆,一個簡單的方法是序列化的載體,又淡化了。你會得到預期的結果。 注:在矢量對象應該是可串行化

(或)

創建一個新的載體,然後遍歷現有載體中並在載體科恩的每個對象,並加入到新它新矢量

+0

我試過'copy = original.clone();'它不起作用! –

+2

你需要更仔細地重讀。假設它是可複製的,將每個對象克隆到新列表中。或者使用序列化,這是一個深層次的操作。但是這依賴於可序列化或可複製的構成對象。 – 2013-09-11 04:44:39

+0

'Vector copy = new Vector(); copy.setSize(((Vector)allPopulation.get(0))。size());對於(int i = 0; i((Vector)allPopulation.get(0))size(); i ++)copy.addElement((Capaciter_n_objet)(((Vector)allPopulation.get(0))。得到(I))); }' 我試過了,它仍然影響原始矢量 –

相關問題