Clonage

[Résolu/Fermé]
Signaler
Messages postés
25
Date d'inscription
mercredi 3 juin 2015
Statut
Membre
Dernière intervention
28 mai 2016
-
Messages postés
25
Date d'inscription
mercredi 3 juin 2015
Statut
Membre
Dernière intervention
28 mai 2016
-
Bonjour;
j'ai un problème dans mon programme java. je veux créer une copie d'une classe qui contient trois variables. j'ai écrit le code suivant:

import java.util.Vector;
public class Ind implements Cloneable{     
   public int V[]=new int[Nmax];
   public int U[][]=new int[Nmax][nmax];
   public Vector <double[][]> weight = new Vector <double[][]>();
//les méthodes de traitement
             ....
  
//la méthode de clonage
public Object clone(){

   Ind monclone = null;
   try {
    
    monclone = (Ind) super.clone();
    
   } catch(CloneNotSupportedException cnse) {
    
    cnse.printStackTrace(System.err);
   }
   monclone.U = (int[][]) U.clone();
   monclone.V = (int[]) V.clone();
   monclone.weight = (Vector<double[][]>) weight.clone();
                        return monclone;
  }
}


Mon problème c'est que le clonage se fait avec succès mais lorsque je modifie l'objet originale, le U et V de l'objet cloné reste inchangeable mais weight change et devient comme weight de l'objet originale. alors je ne conserve pas l'élément initial par le clonage. si vous pouvez m'aider je vous serez reconnaissante.
Merci d'avance

1 réponse

Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 861
Bonjour,

"lorsque je modifie l'objet originale, le U et V de l'objet cloné reste inchangeable"
Pour U c'est normal, il faut également cloner chaque case U[i] puisque ce sont des objets aussi. Mais pour V ça fonctionne. Exemple :

public static void main(String[] args) throws CloneNotSupportedException {
 
 Ind i1 = new Ind();
 
 // initialisation de i1
 
 for (int i=0; i<i1.V.length; i++)
  i1.V[i] = 1;

 // clonage de i1
 
 Ind i2 = (Ind) i1.clone();
 
 // alteration de i1
 
 for (int i=0; i<i1.V.length; i++)
  i1.V[i] = 2;
 
 // affichage de i1 et i2

 for (int i=0; i<i1.V.length; i++)
  System.out.println(i1.V[i]); // attendu 2
 
 for (int i=0; i<i2.V.length; i++)
  System.out.println(i2.V[i]); // attendu 1
}

Avec ton code j'ai bien modification de i1.V sans affecter i2.V

Remarque : si tu une CloneNotSupportedException dans la méthode clone tu dois être plus violent qu'une printStackTrace, car il est totalement exclu que ça arrive.La confiance n'exclut pas le contrôle
Messages postés
25
Date d'inscription
mercredi 3 juin 2015
Statut
Membre
Dernière intervention
28 mai 2016
>
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021

et alors que dois je faire. c'est très difficile pour moi de changer Vector ou Collection<E[]>. y a-t-il une solution pour mon problème?
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 861 >
Messages postés
25
Date d'inscription
mercredi 3 juin 2015
Statut
Membre
Dernière intervention
28 mai 2016

Comme je le disais hier, il faut également cloner chaque case U[i] puisque ce sont des objets aussi. Et pareil pour le Vector.
Messages postés
25
Date d'inscription
mercredi 3 juin 2015
Statut
Membre
Dernière intervention
28 mai 2016

merciiiii j'ai pu cloner chaque case U[i] et ça marche bien mais malheureusement je ne suis pas arrivé à cloner Vector. comment je peux le faiiiiire?
je vous remercie pour votre soutien.
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 861 >
Messages postés
25
Date d'inscription
mercredi 3 juin 2015
Statut
Membre
Dernière intervention
28 mai 2016

Exactement de la même manière avec le Vector, sauf que tu as 3 dimensions donc il faut faire une triple clonage (cloner le vecteur, puis chaque double[][] comme tu as cloné U)

Exemple :

public static void main(String[] args) throws CloneNotSupportedException {

    // initialisation

    Vector<double[][]> vector = new Vector<double[][]>(2);
    for (int i = 0; i < 2; i++)
        vector.add(new double[2][2]);

    // clonage

    Vector<double[][]> clone = (Vector<double[][]>) vector.clone();
    for (int i = 0; i < clone.size(); i++) {
        double[][] content = clone.get(i);
        content = content.clone();
        for (int j = 0; j < content.length; j++)
            content[j] = content[j].clone();
        clone.set(i, content);
    }

    // altération

    for (int i = 0; i < vector.size(); i++)
        for (int j = 0; j < vector.get(i).length; j++)
            for (int k = 0; k < vector.get(i)[j].length; k++)
                vector.get(i)[j][k] = 1.1;

    // affichage

    for (int i = 0; i < vector.size(); i++)
        for (int j = 0; j < vector.get(i).length; j++)
            for (int k = 0; k < vector.get(i)[j].length; k++)
                System.out.print(vector.get(i)[j][k] + " "); // attendu 1.1

    System.out.println();

    for (int i = 0; i < clone.size(); i++)
        for (int j = 0; j < clone.get(i).length; j++)
            for (int k = 0; k < clone.get(i)[j].length; k++)
                System.out.print(clone.get(i)[j][k] + " "); // attendu 0.0
}
Messages postés
25
Date d'inscription
mercredi 3 juin 2015
Statut
Membre
Dernière intervention
28 mai 2016

je ne sais pas quoi dire mais merciiiiiiiiiiiiii et que dieu te protège merciiiiiiiiii, je suis rester dans ce problème des jours et des jour.