IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[Tableau] problème de clonage [Débutant(e)]


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Par défaut [Tableau] problème de clonage
    un exemple qui reproduit mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Bidon {
     
      private int[][] tableau = new int [2][2];
     
      public Bidon (int [][] newTableau) {
        tableau = newTableau;
      }
     
      public void modifyTab() {
        tableau[0][0] += 1;
      }
     
      public int[][] getTab() {
        return tableau;
      }
     
      public void test() {
        Bidon temp = new Bidon(this.tableau.clone());
        temp.modifyTab();
        System.out.println(tableau[0][0]+"   "+temp.getTab()[0][0]); 
      }
    }
    et la classe test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class TestBidon
    {
    	public static void main(String[] args){
    	    int[][] newtab = {{1,2},{3,7}};
    	    Bidon tab = new Bidon(newtab);
    	    tab.test();
    	   }
    }
    j'ai epluché plusieurs article sur clone(), mais aucun ne resoud vraiment le problème de cette maniere (et on comprend pourquoi vu que ca ne marche po) . pourtant ca me semble logique , mais avec tout ces pointeurs caché je ne sais plus vraiment ce que je manipule.
    merci d'avance

    [ Modéré par SEMPERE Benjamin ]
    Ajout des balises code
    Les Règles du Forum

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Avant que quelqu'un lise :
    * balise code
    * explique ton probleme, s'il y a des erreurs de compilations, met les.

  3. #3
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par TabrisLeFol
    Avant que quelqu'un lise :
    * balise code
    * explique ton probleme, s'il y a des erreurs de compilations, met les.
    +1

    Celà dit pour cloner un tableau il y a System.arraycopy()

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    En fait, tu clones un tableau, et ça c'est pas forcément le top....

    je ne sais pas comment est implémentée la méthode clone sur les tableaux (jamais utilisée), mais ce que je sais c'est que ton problème vient de là... les valeurs contenues ne sont pas forcément copiées, il est possible que cela ne clone que la structure du tableau en fait - donc du coup, il faut passer par un "System.arraycopy"...


    Conseil: pour le clonage d'objets, on utilise volontier les constructeurs de recopie en POO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class Foo() {
      private int[][] array = new int[2][2];
     
      // constructeur normal
      Foo(){super();}
     
      // constructeur de clonage
      Foo(Foo foo) {
        super();
        this.array = new int[foo.array.length][foo.array[0].length];
     
        for(int i=0; i<array.length; i++) {
          for(int j=0; j<array[0].length; j++) {
            array[i][j] = foo.array[i][j];
          }
        }
      }
    }
    et ça s'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Foo f = new Foo();
    Foo clone = new Foo(f);

  5. #5
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Oui, le problème est fréquent. La méthode clone fonctionne très bien sur des objets dont les attributs sont primitifs. Si ce n'est pas le cas, la méthode clone est appelée récursivement sur les attributs de type objet (non primitif).
    Ton tableau est un objet particulier certes, mais c'est un objet. Il est fort probable que la méthode clone ne soit pas implémentée. A la place on te propose effectivement d'utiliser "System.arraycopy".

    Ce qui veut dire en clair que tu disposes de 2 solutions quasi-équivalente :
    Redéfinir toi même la méthode clone de ton objet
    Définir un constructeur par recopie (Cf. Pill_S)
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par Hephaistos007
    La méthode clone fonctionne très bien sur des objets dont les attributs sont primitifs. Si ce n'est pas le cas, la méthode clone est appelée récursivement sur les attributs de type objet (non primitif).
    je ne suis pas d'accord, ce comportement est indéfini et est laissé au bon vouloir des classes redéfinissant la méthode clone. Par exemple, la plupart des listes (LinkedList, ArrayList, ...), lors du clonage, ne clonent pas leurs éléments (et oui... une simple copie de référence)
    tu confond peut-être avec la sérialisation, qui, effectivement, stocke tous les attributs non-transient des objets récursivement

    Ce qui veut dire en clair que tu disposes de 2 solutions quasi-équivalente :
    qui peuvent facilement s'utiliser en même temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Foo {
      Foo(){}
      Foo(Foo foo){...}
     
      public Object clone() {
        return new Foo(this);
      }
     
    }

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par mabdylon
    content de voir que ce n'était pas un problème bidon et des solutions apporté. je testerai ca demain et je n'oublierai pas le "resolu". un peu d'eau a mon moulin:
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int x[]={2,4}; 
    int y [] = x.clone(); 
    y[1]+=1;
    ici la methode clone fonctionne très bien. petite curiosité : pourquoi?
    merci encore
    Comme explique precedement, un tableau est un objet, la methode clone() est donc definie dessus. Attention cependant la, le tableau contient des literaux, donc le clone aura des copies des valeurs. Ca ne fonctionnera pas de la meme maniere si les tableau contient des objets (ex: Integer[] ou int[][]), dans ce cas seules les references seront copiees.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Par défaut
    ca marche nickel avec le constructeur de copie. j'essaierai la methode clone s'il me reste du temps avant de rendre le devoir.
    merci
    ps : ou se trouve le bouton resolu?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    En bas à gauche normalement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/03/2015, 12h28
  2. Clonage ligne de tableau
    Par cbv38 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 20/05/2008, 11h11
  3. Probleme : clonage de tableau d'objets
    Par sebastien2222 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 26/09/2006, 09h35
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo