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èmes avec copie de tableau


Sujet :

Collection et Stream Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut [Tableau]Problèmes avec copie de tableau
    Bonjour ,

    je suis en premiere année de licence maths-info et j'ai eu ce sujet en tp
    hier :
    Ecrire une méthode qui prend comme arguments deux tableaux
    t1 et t2 et qui construit et renvoie un tableau tcontenant les elements de t1 suivis des elements de t2.
    J'ai donc fait ce programme :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    mport fr.jussieu.script.*;
    class Concatene {
        public static int[] litTableau (int n) {
            int[] t = new int [n];
            for (int i = 0; i < t.length; i++) {
              Deug.print("Donnez-moi l'entier " + i + " > ");
              t[i] = Deug.readInt();
            }
    	return t;
        }
     
       public static int[] concatene(int x ,int y) {
    	   int [] t1 = litTableau(x);
    	   int [] t2 = litTableau(y);
    	   int [] t = t1;
    	   int p =t.length+1;
    	   for (int i = 0; i < t2.length ; i++) {
    		   t[p]= t2[i];
    		   p=p+1;
    	   }
    	  return t;
       }
    	  public static void main (String[]args) {
    		  int x = Deug.readInt();
    		  int y = Deug.readInt();
    		  int[] t = concatene ( x , y );
    		  for( int i = 0; i < t.length; i++){
    			  Deug.print( t[i] );
    			  Deug.print(' ');
    			 }
    	  }
       }
    Le probleme c'est que en executant le programme j'obtient toujours :
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at Concatene.concatene(Concatene.java:18 )
    at Concatene.main(Concatene.java:26)
    Est-ce que l'on peut m'expliquer a quoi et due cette erreur et comment puis-je la corriger ?


    Merci

  2. #2
    Membre expérimenté Avatar de xxaragornxx
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Par défaut
    Ton t = t1 pose un double problème !

    Non seulement avec le passage par référence en fait c'est t1 que tu te retrouves à modifier.
    Et pour L'exception, comme tu essayes de mettre t2 dans t1, si t2 est plus long ArrayIndexOutOfBoundsException... normal...

    il faut que tu crées un t de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[] t = new int[t1.length + t2.length];
    Et après tu copies t1 puis t2 dedans...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut
    Merci beaucoup pour cette explication
    Je vais essayer de suite !

  4. #4
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Je ne suis pas sure que tu répondes à la question puisque:
    Ecrire une méthode qui prend comme arguments deux tableaux
    t1 et t2 et qui construit et renvoie un tableau tcontenant les elements de t1 suivis des elements de t2.
    Je ne vois aucune de tes méthodes avec une signature du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     public int[] maMéthode(int i[], int j[]) throw......

  5. #5
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Salut Itachi-san!

    Juste pour compléter un peu la réponse de xxaragornxx, tu peux utiliser ce bout de code pour copier tes tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.arraycopy(t1,0,t,0,t1.length-1);
    System.arraycopy(t2,0,t,t1.length,t2.length);
    C'est plus performant que d'utiliser des boucles for.

    Et je suis assez d'accord avec ze_key, ce serait plus logique que des méthode concatene recoivent des tableaux en paramètre (vu que conceptuellement c'est ce que laissepenser son nom).

    Appelle la méthode litTableau directement dans le main.

  6. #6
    Membre expérimenté Avatar de xxaragornxx
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Par défaut
    Citation Envoyé par Descent
    Salut Itachi-san!

    Juste pour compléter un peu la réponse de xxaragornxx, tu peux utiliser ce bout de code pour copier tes tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.arraycopy(t1,0,t,0,t1.length-1);
    System.arraycopy(t2,0,t,t1.length,t2.length);
    C'est plus performant que d'utiliser des boucles for.
    Oui, c'est vrai !
    Par contre je ne sais pas si c'est plus performant (pour ne jamais avoir comparé en fait)... Il faudrait voir les sources de cette méthode pour voir comment elle procède...

  7. #7
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par xxaragornxx
    Oui, c'est vrai !
    Par contre je ne sais pas si c'est plus performant (pour ne jamais avoir comparé en fait)... Il faudrait voir les sources de cette méthode pour voir comment elle procède...
    C'est ce que j'ai toujours entendu dire à son propos.

    Par contre en cas de copie de tableau d'objets il faut tenir compte du fait que c'est une copie superficielle qui est réalisée c'est à dire que seules les références sont copiées - il n'y a pas duplication des objets eux-mêmes.

  8. #8
    Membre expérimenté Avatar de xxaragornxx
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Par défaut
    Citation Envoyé par Descent
    C'est ce que j'ai toujours entendu dire à son propos.
    Bon... à voir...
    (j'suis un peu comme St Thomas en fait )

    Citation Envoyé par Descent
    Par contre en cas de copie de tableau d'objets il faut tenir compte du fait que c'est une copie superficielle qui est réalisée c'est à dire que seules les références sont copiées - il n'y a pas duplication des objets eux-mêmes.
    Tout comme dans la méthode des boucles d'ailleurs !

  9. #9
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par xxaragornxx
    Citation Envoyé par Descent
    Salut Itachi-san!

    Juste pour compléter un peu la réponse de xxaragornxx, tu peux utiliser ce bout de code pour copier tes tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.arraycopy(t1,0,t,0,t1.length-1);
    System.arraycopy(t2,0,t,t1.length,t2.length);
    C'est plus performant que d'utiliser des boucles for.
    Oui, c'est vrai !
    Par contre je ne sais pas si c'est plus performant (pour ne jamais avoir comparé en fait)... Il faudrait voir les sources de cette méthode pour voir comment elle procède...
    Arf ca me rappelle un programme ou un gars avait optimize le memcpy dans un prog C en ecrivant une boucle for custom a la place.. resultat: suivant la plateforme, il etait au mieux aussi rapide que le memcpy.

    Faite un peu confiance au langage que diable. Si sun propose arraycopy c'est qu'il y a un interet a ca, d'ailleurs c'est pas pour rien que c'est une methode native, il y aurait du memcpy la dessous que ca ne m'etonnerait pas.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  10. #10
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Et si c'est la FAQ Java de developpez.com qui le dit?

    http://java.developpez.com/faq/java/..._resizeTableau

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut
    Je vous remercie tous pour vos conseils car le programme fonctionne maintenant .

    j'ai du changer qqch par rapport au code de Descent. Il avait donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.arraycopy(t1,0,t,0,t1.length-1);
    		   System.arraycopy(t2,0,t,t1.length,t2.length);
    Or je comprenais pas pourquoi ça ne fonctionnait qu'a moitié
    et grace au FAQ j'ai vu que l'erreur se situait a la premiere ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.arraycopy(t1,0,t,0,t1.length);
    		   System.arraycopy(t2,0,t,t1.length,t2.length);
    Il n'y avait pas de -1 a la longueur.

    Je ne connaissais pas cette methode donc je vous remercie Beaucoup !


    Ps : Il n'ya pas de throw dans ma methode parce qu'on ne m'a pas appris a le faire de cette façon là. Mais le resultat est le meme

  12. #12
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Oui tu as raison...

    Ce qui me dépasse c'est pourquoi j'ai mis un "-1"

    Désolé de t'avoir induis en erreur...

  13. #13
    Membre expérimenté Avatar de xxaragornxx
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Par défaut
    Citation Envoyé par Descent
    Et si c'est la FAQ Java de developpez.com qui le dit?

    http://java.developpez.com/faq/java/..._resizeTableau


    Oui bon vu comme ça
    Bien qu'un p'tit coup d'un outil type OptimiZeit pour mesurer tout ça...

    Bulbo >> Je n'avais pas de doute sur le fait que c'était moins rapide, vu qu'au pire j'espère qu'elle sert au moins à s'affranchir de coder les itérations en les faisant elle même. Je me demandais juste s'il y avait de l'otimisation là dessous... Bon à priori oui et pas qu'un peu...

  14. #14
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par xxaragornxx
    Bulbo >> Je n'avais pas de doute sur le fait que c'était moins rapide, vu qu'au pire j'espère qu'elle sert au moins à s'affranchir de coder les itérations en les faisant elle même. Je me demandais juste s'il y avait de l'otimisation là dessous... Bon à priori oui et pas qu'un peu...
    Je n'ai pas le code sous les yeux, mais comme le dit Bulbo il y a de forte chance qu'il y ai un memcpy() derrière tout ca, ce qui fait qu'il n'y a pas d'itération mais une grosse copie du bloc en entier...

    Par exemple, si tu as un tableau de 1000 éléments à copier, avec arraycopy() tu dois avoir 1 copie d'un bloc de 1000 éléments, alors qu'avec un for tu as 1000 copies d'un éléments (type natif ou référence)...

    Maintenant je pense qu'il faut utiliser des tableaux de tailles assez conséquentes pour avoir une différence sensible...

    a++

Discussions similaires

  1. Envoi d'un mail avec copie du tableau sous Notes
    Par jamesdu75 dans le forum Excel
    Réponses: 1
    Dernier message: 21/06/2013, 20h07
  2. Réponses: 2
    Dernier message: 26/10/2011, 10h15
  3. Décalage avec les cases d'un tableau pour étendre mes évènements
    Par Chouller dans le forum PHP & Base de données
    Réponses: 42
    Dernier message: 16/04/2009, 09h51
  4. Réponses: 11
    Dernier message: 22/05/2008, 14h11
  5. Copie d'un tableau dans l'autre avec formule
    Par Pascal26 dans le forum Excel
    Réponses: 2
    Dernier message: 18/01/2008, 10h27

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