begin process at 2012 02 15 11:39:29
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Divers

 > 

Général

 > 

clonage profond


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

clonage profond

dimanche 5 novembre 2006 à 21:38:43 | clonage profond

3615jenveux

Bonjour,

Je désirerais faire un clonage profond d'un objet "Plateau" qui contient  une unique propriété : un int[][] nommé "plateau".
Or si j'ai bien réussi a cloner l'objet "Plateau" et le conteneur "plateau", les valeurs de "plateau" sont une même instance et donc un simple clonage de surface. C'est mon System.arraycopy qui visiblement fait une copie par référence et qui ne va pas !! Quelqu'un aurait-il une solution ?

    public Plateau clone() throws CloneNotSupportedException {
        Plateau p = null;
        try {
            p = (Plateau)super.clone();
            p.setPlateau((int[][])this.getPlateau().clone());
            System.arraycopy(getPlateau(), 0, p.getPlateau(), 0 , getPlateau().length);
        }
        catch(CloneNotSupportedException cnse) {
            cnse.printStackTrace();
        }
        return p;
    }


-------------------------------------------------------------------------
le code complet :
-------------------------------------------------------------------------
public class Plateau implements Cloneable {
    /* données membres */
    private int plateau[][];
   
       
    /* constructeurs */
    public Plateau() {
        this.plateau = new int[4][4];
    }

   
    /* getters & setters */
    public int[][] getPlateau() {
        return this.plateau;
    }

    public void setPlateau(int[][] plateau) {
        this.plateau = plateau;
    }

    public int getValeur(int x, int y) {
        return this.plateau[x][y];
    }
   
    public void setValeur(int x, int y, int valeur) {
        this.plateau[x][y] = valeur;
    }

   


    /* méthodes public */

    public void affichePlateauDeJeu() {
        String chaine[] = this.pourVisualisationPlateauDeJeu();
        for (int i=1 ; i <=3 ; i++) {
            System.out.println(chaine[i]);
        }
    }
   
   
    /**
     * @return un tableau de String contenant la visualisation du plateau de jeu
     */
    public String[] pourVisualisationPlateauDeJeu() {
        char[] symbole = new char[2];
        symbole[0] = ' ';
        symbole[1] = 'X';
        String chaine[] = new String[4];
        char temp;
        for (int h=1 ; h<=3 ; h++) {
            chaine[h]= new String("");
            for (int l=1 ; l<=3 ; l++) {
                temp = symbole[plateau[l][h]];
                chaine[h]+="|"+temp;
            }
            chaine[h]+="|";
            chaine[h]+="    ";
        }
        return chaine;
    }
   
   
   
    public Plateau clone() throws CloneNotSupportedException {
        Plateau p = null;
        try {
            p = (Plateau)super.clone();
            p.setPlateau((int[][])this.getPlateau().clone());
            System.arraycopy(getPlateau(), 0, p.getPlateau(), 0 , getPlateau().length);
        }
        catch(CloneNotSupportedException cnse) {
            cnse.printStackTrace();
        }
        return p;
    }
}



public class Demo {
    public static void main(String[] args) {
        Plateau p = new Plateau();
        p.setValeur(2, 1, 1);
        p.affichePlateauDeJeu();
        System.out.println("");
       
        Plateau p2 = null;
        try {
            p2 = p.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Bloc catch auto-généré
            e.printStackTrace();
        }
        p2.setValeur(1, 1, 1);
       
        p.affichePlateauDeJeu();
        System.out.println("p:"+p);
        int[][] t = p2.getPlateau();
        System.out.println("p.getPlateau():" + t);
        System.out.println(""+t[0]);
       
        p2.affichePlateauDeJeu();
        System.out.println("p2:"+p2);
        int[][] t2 = p2.getPlateau();
        System.out.println("p2.getPlateau():" + t2);
        System.out.println(""+t2[0]);
    }
}


dimanche 5 novembre 2006 à 23:36:28 | Re : clonage profond

3615jenveux

Réponse acceptée !
Copier les valeurs une a une dans une nouvelle instance de int[][] :

public PlateauDeJeu clone() throws CloneNotSupportedException {
        PlateauDeJeu p = null;
        try {
            // On récupère l'instance à renvoyer par l'appel de la
            // méthode super.clone()
            p = (PlateauDeJeu)super.clone();
            
            p.plateau = new int[4][4];
            
            for (int i = 0 ; i < 4 ; i++) {
                for (int j = 0 ; j < 4 ; j++) {
                    if (getValeur(i, j) == 0) p.setValeur(i, j, 0);
                    if (getValeur(i, j) == 1) p.setValeur(i, j, 1);
                    if (getValeur(i, j) == 7) p.setValeur(i, j, 7);
                }
            }
        }
        catch(CloneNotSupportedException cnse) {
            cnse.printStackTrace(System.err);
        }

        return p;
    }
lundi 6 novembre 2006 à 11:15:41 | Re : clonage profond

super_toinou

Hello, un ptit tips, Pour pas te prendre la tete, t utilise SerializationUtils.clone d apache (org.apache.commons.lang.SerializationUtils), il faut juste que ta classe soit serializable et t aura un clonage profond à n niveau qui sera fait (si t as des objets non sérializable je crois qu il seront squizzés (a la maniere de transient) Comme ca si tu rajoute des trucs dans ta classe t aura pas a retoucher ton code ! ++ Toinou


Cette discussion est classée dans : public, int, system, plateau, getplateau


Répondre à ce message

Sujets en rapport avec ce message

methode paint appelée mais qui ne peint rien [ par seb87 ] bonjour, je me bats toujour avec mes images.ma nouvelle question est a propos de la surdefinition de paint.j'ai une image sur laquelle je dessine des non-static variable this cannot be referenced from a static context [ par organik ] Bonjour..j'ai un souci à la compilation d'un programme... j'ai le message d'erreur : "non-static variable this cannot be referenced from a static con Piles [ par Flooby ] Bonjour, je suis vraiment debutant en JAVA et j'ai besoin d'aide pour mon cours d'algo car j'ai un exposé a rendre demain.J'aimerai effectuer l'implem Implementation d'une pile [ par Flooby ] Bonjour, je suis vraiment debutant en JAVA et j'ai besoin d'aide pour mon cours d'algo car j'ai un exposé a rendre demain.J'aimerai effectuer l'implem pb Keylistener [ par lenneth666 ] punaiz jdevien fou, j'ai regardé plein de tutoriaux sur lé keylistener et ca ne marche pas. Voici mon code public class Chenille extends JFrame imp Urgent svp un probleme de trie!!!! [ par wissal04 ] avant de commencer bsr a tous,j'ai un probleme de tri,j'ai fais un tableau a une seul dimenssion et je voudrais le trié avant d'afficher son contenue besoin d'aide pour mon programme java [ par pouyoudu17 ] Bonjour,J'ai fait un programme java pour faire un annuaire mais il y a quelques erreurs.<b salutque fais ce programme java? [ par bluelagoon91 ] salut! est ce que quelqu'un pourrait m'expliquer ce que fait ce progarmme java!merci<img src="/imgs slt [ par samira46 ] voila les codes: 1.la classe du serveur: import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class serveur { Afficher deux triangles [ par scoobidooo1 ] Aide pour faire afficher ces deux programmes (triangles) dans une seule commande, un seul affichage pour les deux triangles en même temps je sais que


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,791 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales