Clonage

Résolu/Fermé
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016 - Modifié par KX le 3/06/2015 à 19:56
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016 - 6 juin 2015 à 13:37
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
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 3/06/2015 à 20:47
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
0
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016
4 juin 2015 à 02:03
Merci pour la réponse et pour le cour délai. mais désolé, il me parait que j'ai pas compris votre réponse.
je ne sais pas pourquoi vous avez traité la variable V car j'ai dit que j'ai pas de problèmes pour V et U mais weight ouiiiiiii cette variable est la seule qui ne conserve pas la valeur initiale clonée.
je vous remercie
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 juin 2015 à 07:00
"j'ai pas de problèmes pour V et U"
V on est d'accord, mais pourtant U tu auras des problèmes...

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

	Ind i1 = new Ind();

	// initialisation de i1

	for (int i = 0; i < i1.U.length; i++)
		for (int j = 0; j < i1.U[i].length; j++)
			i1.U[i][j] = 1;

	// clonage de i1

	Ind i2 = (Ind) i1.clone();

	// alteration de i1

	for (int i = 0; i < i1.U.length; i++)
		for (int j = 0; j < i1.U[i].length; j++)
			i1.U[i][j] = 2;

	// affichage de i1 et i2

	for (int i = 0; i < i1.U.length; i++)
		for (int j = 0; j < i1.U[i].length; j++)
			System.out.print(i1.U[i][j]); // attendu 2

	System.out.println();

	for (int i = 0; i < i2.U.length; i++)
		for (int j = 0; j < i2.U[i].length; j++)
			System.out.print(i2.U[i][j]); // attendu 1
}

Et si tu as des problèmes avec Vector c'est pour les même raisons que pour U.
Le clonage d'un double tableau ne clone que la première dimension, la deuxième doit être clonée à la main.

C'est une des raisons pour lesquelles on évite d'avoir des types paramétrés de type tableaux.
Collection<Collection<E>>
oui,
Collection[]
à la rigueur, mais
Collection<E[]>
non, c'est dangereux.

Remarque : Vector est une classe dépréciée. On devrait utiliser ArrayList à la place.
0
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
4 juin 2015 à 12:37
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?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016
4 juin 2015 à 17:42
Comme je le disais hier, il faut également cloner chaque case U[i] puisque ce sont des objets aussi. Et pareil pour le Vector.
0
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016
6 juin 2015 à 00:42
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.
0