在修改它的副本时保持原始Vector完好无损

时间:2013-09-11 03:01:26

标签: java netbeans data-structures vector copy

我想复制包含以下结构的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);

 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();}


    }       

不幸的是,我使用的所有这些方法都给我带来了同样的问题! 无论我修改目的地!!!原来的一个也被修改!!!!!! 任何想法,请!!这让我疯狂 !我不明白为什么!!现在我被困3天

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;
 }                             

突变功能如下......:

{{1}}

2 个答案:

答案 0 :(得分:0)

你需要进行深度克隆,一种简单的方法是序列化载体并再次对其进行脱盐。您将获得预期的结果。 注意:向量中的对象应该是可序列化的

(或)

创建一个新的向量,然后遍历现有向量并对向量中的每个对象进行colne并将其添加到新向量

答案 1 :(得分:0)

最后我从我的一个朋友那里得到了解决方案,最近,我发现如果我们使用包含VectorData Struct元素的Class,那么所有类型的我上面提到的副本总是导致浅拷贝 所以解决方案是创建一个复制构造函数或函数来制作 DEEP Copy ,我们现在得到的建议函数是:

 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;           
 }

并且感谢你提出的所有建议和想法:)