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

avec Java Discussion :

Deux tableaux modifié par une seule affectation ?


Sujet :

avec Java

  1. #1
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut Deux tableaux modifié par une seule affectation ?
    Bonjour à tous ,

    Je suis plutôt débutant en Java, donc il y a peut-être des choses que je ne connais pas. Mais la j'ai un soucis que je n'ai pas trouvé sur le net et duquel je n'arrive pas à faire l'analogie avec le C++ que je maitrise mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i=index;i<tab.length;i++)
    {
    	if(i<tab.length-1) tab[i+1]=tab_final[i];
    }
    tab[index]=nb;
    return tab;
    Je m'explique, je dois décaler les éléments d'un tableau vers la droite, à partir de la variable "index". Le tableau contient 10 éléments, et à l'index ou je commence le décalage je dois lui affecter la valeur nb.
    Pour se faire, je copie tab dans tab_final (qui lui n'est pas sensé bouger, et servir de modèle pour le décalage de tab)

    Seulement, mes deux tableaux se modifient on dirait, alors en admettant que tab (et donc tab_final) contiennent les entiers suivants :
    : { 2,14,4,18,23,9,7,17,1,5 };

    et que l'index à partir duquel je décale est 3, et nb=99, la forme finale de mes deux tableaux serait comme cela :
    : { 2, 14, 4, 99, 18, 18, 18, 18, 18, 18 }

    C'est de la folie ou je ne connais pas comment procède java, mais dans mon code je n'affecte pourtant que tab ! Une âme charitable serait-elle encline à m'aider à comprendre ceci svp ?
    Thanks

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Vespiras Voir le message
    Pour se faire, je copie tab dans tab_final (qui lui n'est pas sensé bouger, et servir de modèle pour le décalage de tab)
    Comment tu fais ta copie ?

    Si comme je le pense tu fais quelque chose comme cela :
    Alors c'est normal : ce n'est pas une copie mais une affectation !
    tab et tab_final sont alors deux références qui pointent vers le même tableau en mémoire.


    La copie doit être explicite, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[] tab_final = Arrays.copyOf(tab, tab.length);





    Maintenant c'est le genre d’algorithme pas très gourmand en mémoire (à cause de la duplication du tableau).
    En effectuant les affectations en partant de la fin on peut se passer de cette copie, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	int index = 3;
    	int nb = 99;
     
    	if (index<0 || index>=tab.length) {
    		throw new ArrayIndexOutOfBoundsException(index);
    	}
     
    	for (int i=tab.length-1; i>index; i--) {
    		tab[i] = tab[i-1];
    	}
    	tab[index] = nb;
    a++

  3. #3
    Membre actif Avatar de fastdeath124
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Août 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Août 2011
    Messages : 117
    Points : 200
    Points
    200
    Par défaut
    T'as quelque part dans ton code tab_final = tab n'est ca pas?
    Si oui, le problème se trouve ici. En effet, en java, on ne peut pas manipuler directement des pointeurs, mais malheureusement, "tab_final = tab", car cette instruction ne fait que copier la référence du tableau tab (et non pas son contenu) et par conséquent on obtient deux pointeurs sur la même référence ce qui explique le comportement que tu décris.
    Pour résoudre le problème, il faut créer une nouvelle référence (un nouvel objet) et copier le contenu de tab (case par case) dans tab_final.

  4. #4
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Pourrais tu nous montrer comment tu crées tes 2 tableaux.

    En effet en Java, tout fonctionne par référence aux objets que l'on manipule, donc si tu écris quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String s1 = "toto";
    String s2 = s1;
     
    System.out.println(s1);
    System.out.println(s2);
     
    s1 = "tata";
     
    System.out.println(s1);
    System.out.println(s2);
    Comme s2 travaille sur une référence de s1, si tu modifie s1 tu modifies en même temps s2.

    Donc au final tu auras à l'affichage
    toto
    toto
    tata
    tata
    Et j'imagine que tu fais pareil avec ton tableau.

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    @Nico02 : ton exemple est faux !

    En Java une affectation ne fait pas une copie et ne modifie pas un objet.
    En Java une affection affecte seulement une valeur dans une référence.


    Pour reprendre ton code :
    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
     
    String s1 = "toto";
    String s2 = s1;
     
    // Ici s1 et s2 sont deux références distinctes qui pointent vers le même objet en mémoire
     
    System.out.println(s1); // "toto"
    System.out.println(s2); // "toto"
     
    s1 = "tata";
     
    // Ici on a affecté une nouvelle références à s1, donc s1 et s2 pointent sur deux objets distincts 
     
    System.out.println(s1); // tata
    System.out.println(s2); // toto


    Les String n'étant pas modifiable on ne peut pas reproduire le problème avec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	Date d1 = new Date();
    	Date d2 = d1;
     
    	// d1 et d2 pointent vers le même objet en mémoire
     
    	// Du coup si on modifie l'état de l'objet pointé par "d2",
    	// cela impacte également l'objet pointé par "d1"
    	// car il s'agit du même objet.
    	d2.setTime(0L);

    En C/C++ cela s'approche plus d'une manipulation de pointeur...


    a++

  6. #6
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Ok merci à tous
    Effectivement je vais ma copie comme ceci :
    Et au final je ne trouvais pas sur le net car je ne cherchais pas correctement, (en mots clés je regardais du côté deux tableaux modifiés une seule affectation, etc ... lol)

    Donc au final qu'elle est la best practice pour copier un tableau dans un autre svp ?

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Vespiras Voir le message
    Donc au final qu'elle est la best practice pour copier un tableau dans un autre svp ?
    Le plus simple est d'utiliser Arrays.copyOf() comme je l'ai indiqué...


    a++

  8. #8
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Ok je savais pas du coup qu'elle technique utilisaient les dev's Java pour copier leur tableaux, vu qu'il existe plusieurs manières de faire. Merci à tous pour votre réactivité et merci à adiGuba pour sa réponse

    Je me ferais plus avoir !

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

Discussions similaires

  1. Remplacement de balises par une seule autre
    Par laurent35 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 25/04/2006, 08h48
  2. valeur d'un champ text modifié par une variable en parametre
    Par klimero dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 21/04/2006, 10h39
  3. Réponses: 1
    Dernier message: 04/04/2006, 16h09
  4. [Tableaux] trier par une vari
    Par madame dans le forum Langage
    Réponses: 5
    Dernier message: 28/02/2006, 11h38
  5. Réponses: 4
    Dernier message: 11/10/2005, 10h17

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