Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : clonage profond [ Divers / Général ] (3615jenveux)

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é 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 { problème d'affichage à mon avis pas difficile à résoudre [ par wamdeus ] Voici mon code, et j'aimerai avoir une petite aide.Mon problème est simple ... il m'affiche pas ma grille ... je sais pas pourquoi ; il ne détecte pas


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.