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 :

Problème modification d'Array.


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Homme Profil pro
    Chercheur d'Emploi
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'Emploi

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 65
    Points
    65
    Par défaut Problème modification d'Array.
    Je rencontre un petit problème sur cet exercice: http://codingbat.com/prob/p118044

    Voici mon code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public int[] swapEnds(int[] nums) {
      int[] ret = nums;
      ret[0] = nums[nums.length-1];
      ret[nums.length-1] = nums[0];
      return ret;
    }
    Si on rentre par exemple swapEnds([1, 2, 3, 4])

    Ca sort {4,2,3,4} et non {4,2,3,1} comme je l'aurais pensé.

    C'est comme si nums[0] avait pris comme valeur nums[nums.length-1] avant la 4ème ligne mais je ne comprends pas pourquoi.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Citation Envoyé par CoDuSu Voir le message
    C'est comme si nums[0] avait pris comme valeur nums[nums.length-1] avant la 4ème ligne mais je ne comprends pas pourquoi.
    Parce qu'avec la ligne 2, int[] ret = nums;, tu crées une nouvelle variable qui pointe vers le même objet que num.
    Donc, quand tu y touches à travers l'une des deux variables, y accéder à travers l'autre variable te permettra de voir le changement, parce que quelle que soit la variable, ça ne change rien au fait que c'est le même objet.

    Quand on veut un nouvel objet en Java, il faut faire un new. As-tu fait un new ? Donc tu n'as pas de nouvel objet et donc le tableau que tu as, c'est le même tableau que celui que tu avais déjà avant.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Chercheur d'Emploi
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'Emploi

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 65
    Points
    65
    Par défaut
    J'avais justement supposé ça et donc essayer ce qui suis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int[] swapEnds(int[] nums) {
      int[] ret = new int[nums.length];
      ret = nums;
      ret[0] = nums[nums.length-1];
      ret[nums.length-1] = nums[0];
      return ret;
    }
    Mais ça n'a rien changé au résultat.

    Je suppose que c'est encore le ret = nums; qui pose encore problème. Mais comment ça se fait ? puisque cette fois ret est supposé être un objet différent.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah, oui,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      int[] ret = new int[nums.length];
      ret = nums;
    fait bien que tu créés un nouveau tableau (par new), mais tu le remplaces immédiatement par le tableau passé en paramètre, donc la variable ret continue de "pointer" sur le même tableau que "nums", après l'exécution de la deuxième ligne ci-dessus (avant, ret référence bien un nouveau tableau, rempli de 0) !

    Pourquoi veux-tu absolument passer par un tableau pour faire l'échange ? Pour éviter de modifier le tableau d'origine ? Dans ce cas, il te faut copier le tableau d'origine dans un nouveau, puis faire l'échange entre début et fin, en utilisant un variable int locale simplement comme variable intermédiaire d'échange sur le nouveau tableau, ou utiliser le tableau d'origine directement comme source des deux cellules échangées.

    Pour copier le tableau,

    1. soit faire une boucle et copier chaque élément 1 à 1
    2. soit utiliser System.arraycopy(...)
    3. soit utiliser Arrays.copyOf(...)


    L'opérateur = est un opérateur d'affectation : pour les types primitifs on affecte la valeur, pour les types objet on affecte la référence de l'objet. En aucun cas = voudrait dire : ma nouvelle variable référence une copie de ce qui est référencé par l'autre variable.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Chercheur d'Emploi
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'Emploi

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Points : 65
    Points
    65
    Par défaut
    Donc ça c'est bon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int[] swapEnds(int[] nums) {
     int[] ret = new int[nums.length];
     System.arraycopy( nums, 0, ret, 0, nums.length );
     ret[0] = nums[nums.length-1];
     ret[nums.length-1] = nums[0];
     return ret;
    }
    Ainsi que ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public int[] swapEnds(int[] nums) {
     int[] ret = Arrays.copyOf( nums, nums.length );
     ret[0] = nums[nums.length-1];
     ret[nums.length-1] = nums[0];
     return ret;
    }
    Par contre:

    Pour copier le tableau,

    soit faire une boucle et copier chaque élément 1 à 1
    soit utiliser System.arraycopy(...)
    soit utiliser Arrays.copyOf(...)
    Je viens aussi de trouver la methode clone() qui a l'air finalement d'être la mieux adapté dans ce cas non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public int[] swapEnds(int[] nums) {
      int[] ret = nums.clone();
      ret[0] = nums[nums.length-1];
      ret[nums.length-1] = nums[0];
      return ret;
    }
    Qu'en penses-tu ? Y'a-t-il une raison pour laquelle tu n'en a pas parlé ou c'est juste un oubli ?


    Merci a vous 2 pour toutes vos réponses cette aprèm. Rapides et completes. Ce forum est très enrichissant.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Personnellement, je connais assez peu de cas où la méthode clone() sert réellement à quelque chose, et à cause de cela je m'y intéresse peu et sais très peu de choses dessus.

    Je ne savais absolument pas qu'il est possible de l'appeler sur un tableau et obtenir le résultat qui a le plus de sens intuitivement (en tout cas pour les tableaux à une seule dimension.)

    Cela explique pourtant pourquoi il n'y a pas de méthode Arrays.copyOf() qui dispense de fournir une nouvelle longueur au tableau et simplement utilise la même longueur : parce que dans ce cas-là autant utiliser clone().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [Tableaux] Problème avec un array
    Par baleiney dans le forum Langage
    Réponses: 5
    Dernier message: 08/07/2006, 17h54
  2. Problème : modification d'un paramètre sous IE
    Par insane_fr dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 27/05/2006, 16h49
  3. [Tableaux] Problème avec un array et les pseudo frame
    Par azerty53 dans le forum Langage
    Réponses: 6
    Dernier message: 10/05/2006, 14h57
  4. Réponses: 6
    Dernier message: 15/02/2006, 14h02
  5. problème avec les array en pl/pgsql
    Par nico31120 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/03/2005, 16h04

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