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

 Java Discussion :

Tableau 2 dimensions


Sujet :

Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    février 2007
    Messages
    567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 567
    Points : 156
    Points
    156
    Par défaut Tableau 2 dimensions
    Bonsoir à tous,
    J'ai créé ce tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private double[][] taux = {{10,15,20,25,30,35,40},{0.8,1.2,1.54,2.83,2.99,3.40,3.99 }};
    J'ai besoin de parcourir que la "première dimension" si je peux dire ainsi soit {10,15,20,25,30,35,40} et si je trouve une équivalence aller dans la deuxième dimension {0.8,1.2,1.54,2.83,2.99,3.40,3.99 } en affectant la valeur de i à j soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(int i = 0; i < taux.length; i++){			 
    	if(taux[i]==ch3) { 
    				   int j=i;
    				   txtTaux.setText(String.valueOf(taux[j]));					
    			       } 
    			                    }
    Le problème est quand j'éxécute et que i s'incrémente (i=1) le débogueur m'indique tab[i] = 1.2 soit le deuxième élément de la deuxième dimension. Peut être que mon code n'est pas bon si quelqu'un a une idée. MERCI

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 11 808
    Points : 27 837
    Points
    27 837
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est un peu confus tout ça : ton code déclare une variable de type tableau taux et tu dis que ton débugger affiche la valeur tab[i] : quel rapport entre taux et tab ?

    Quand on déclare un tableau à 2 dimensions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private double[][] taux = {{10,15,20,25,30,35,40},{0.8,1.2,1.54,2.83,2.99,3.40,3.99 }};
    taux[0] et taux[1]... (taux[i]...) sont des lignes du tableau. Je ne sais pas ce que vaux ch3 dans ton code, mais si ce n'est pas la référence du tableau taux[0] ou celle de taux[1], ta boucle ne fera jamais rien d'autre que boucler (la condition du if ne sera jamais vraie).

    Si cette condition peut être vraie (donc ch3 est un tableau), tout ce que tu fais dans le bloc du if est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(taux[i]==ch3) { 
    				   int j=i;
    				   txtTaux.setText(String.valueOf(taux[j]));					
    			       }
    dire que j vaut i : autant se passer de j et d'utiliser directement i. Et ensuite tu affectes dans un JLabel ou équivalent, la valeur String de représentation du tableau, un code qui ne veut pas dire grand chose (un truc du genre [D@5305068a, rien de bien intéressant à priori).

    Avec ch3 un double, le taux à chercher, le code serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0; i<taux[0].length; i++) {
       if ( taux[0][i] == ch3 ) {
    	txtTaux.setText(String.valueOf(taux[1][i]));					
       }
    }
    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.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    février 2007
    Messages
    567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 567
    Points : 156
    Points
    156
    Par défaut
    C'est un peu confus tout ça : ton code déclare une variable de type tableau taux et tu dis que ton débugger affiche la valeur tab[i] : quel rapport entre taux et tab ?
    Bonjour et merci pour ton aide; oui autant pour moi c'est bien taux[i] et pas tab[i]
    Quand on déclare un tableau à 2 dimensions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private double[][] taux = {{10,15,20,25,30,35,40},{0.8,1.2,1.54,2.83,2.99,3.40,3.99 }};
    taux[0] et taux[1]... (taux[i]...) sont des lignes du tableau. Je ne sais pas ce que vaux ch3 dans ton code, mais si ce n'est pas la référence du tableau taux[0] ou celle de taux[1], ta boucle ne fera jamais rien d'autre que boucler (la condition du if ne sera jamais vraie).
    ch3 est un tableau de double qui récupère la valeur de ch2. Oui effectivement quand je sélectionne dans ma liste déroulante la même valeur que le premier élément de la première dimension du tableau en l’occurrence 10 il ne me renvoie faux (inégal) et là je ne comprends pas pourquoi ... car lors du débogage j'ai bien taux[0) = 10,0 et ch3=10,0
    : voici un extrait du code ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private String ch;
    private double ch2;
     
    private class GesListe implements ActionListener{//Classe Interne
    		@Override 
    		public void actionPerformed(ActionEvent e) {		
    			txtTaux.setText(cboAnnees.getSelectedItem().toString());
    			ch=cboAnnees.getSelectedItem().toString();
    			ch2=Double.parseDouble(ch); // parseDouble(String s)
    			double[] ch3= {ch2};
    Si cette condition peut être vraie (donc ch3 est un tableau), tout ce que tu fais dans le bloc du if est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(taux[i]==ch3) { 
    				   int j=i;
    			   txtTaux.setText(String.valueOf(taux[j]));					
    			       }
    dire que j vaut i : autant se passer de j et d'utiliser directement i. Et ensuite tu affectes dans un JLabel ou équivalent, la valeur String de représentation du tableau, un code qui ne veut pas dire grand chose (un truc du genre [D@5305068a, rien de bien intéressant à priori).

    Avec ch3 un double, le taux à chercher, le code serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0; i<taux[0].length; i++) {
       if ( taux[0][i] == ch3 ) {
    	txtTaux.setText(String.valueOf(taux[1][i]));					
       }
    }
    Je veux pouvoir aller avec l'indice ou la valeur de i et en l'affectant à j aller récupérer la valeur de taux[j] (deuxième dimension). D'autre part
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if ( taux[0][i] == ch3 )
    ne marche pas car ch3 est un tableau de double à une dimension mais ça tu ne pouvais pas le savoir.
    L'autre problèmes que j'ai est :
    - pourquoi au début de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(int i = 0; i < taux.length; i++)
    taux[i] represente {10,15,20,25,30,35,40} soit le première dimension et puis ensuite après incrémentation de i taux[i] représente {0.8,1.2,1.54,2.83,2.99,3.40,3.99 } soit la deuxième dimension ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 11 808
    Points : 27 837
    Points
    27 837
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Je veux pouvoir aller avec l'indice ou la valeur de i et en l'affectant à j aller récupérer la valeur de taux[j] (deuxième dimension). D'autre part
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if ( taux[0][i] == ch3 )
    ne marche pas car ch3 est un tableau de double à une dimension mais ça tu ne pouvais pas le savoir.
    Bah remplace ch3 par ch2. De toute manière il est impossible que taux[i]==ch3 soit vrai quelque soit i. Ce sont deux objets différents. Et ça n'a même aucun sens de chercher à tester l'égalité entre un tableau de 1 double et un tableau de 7 doubles !

    Citation Envoyé par xeron33 Voir le message
    - pourquoi au début de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(int i = 0; i < taux.length; i++)
    taux[i] represente {10,15,20,25,30,35,40} soit le première dimension et puis ensuite après incrémentation de i taux[i] représente {0.8,1.2,1.54,2.83,2.99,3.40,3.99 } soit la deuxième dimension ?
    Parce que les premiers [] de taux représentent la première dimension. Un tableau à deux dimensions est un tableau de tableau. taux[i] c'est donc une ligne. quand i=0, c'est la première ligne (le premier tableau et quand i=1, c'est le second tableau, la deuxième ligne. Et quand on écrit taux[i][j] on dit qu'on accède à la cellule d'index j du tableau taux[i] qui est le tableau de position i dans taux.
    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 habitué
    Profil pro
    Inscrit en
    février 2007
    Messages
    567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 567
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Bah remplace ch3 par ch2. De toute manière il est impossible que taux[i]==ch3 soit vrai quelque soit i. Ce sont deux objets différents. Et ça n'a même aucun sens de chercher à tester l'égalité entre un tableau de 1 double et un tableau de 7 doubles !



    Parce que les premiers [] de taux représentent la première dimension. Un tableau à deux dimensions est un tableau de tableau. taux[i] c'est donc une ligne. quand i=0, c'est la première ligne (le premier tableau et quand i=1, c'est le second tableau, la deuxième ligne. Et quand on écrit taux[i][j] on dit qu'on accède à la cellule d'index j du tableau taux[i] qui est le tableau de position i dans taux.
    *********************************************
    Ca marche maintenant avec un tableau de String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	private String[][] taux = {{"10","15","20","25","30","35","40"},{"0.8","1.2","1.54","2.83","2.99","3.40","3.99" }};
    	private String ch;
    et après tes infos j'ai pigé le fonctionnement des tableaux à plusieurs dimensions enfin je pense...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void actionPerformed(ActionEvent e) {		
    			txtTaux.setText(cboAnnees.getSelectedItem().toString());
    			ch=cboAnnees.getSelectedItem().toString();
    			for(int i = 0; i < taux.length; i++){			 				  
    						for(int j=0;j < taux[i].length;j++) {
    							 if(taux[i][j]==ch) { 	
    						   txtTaux.setText(String.valueOf(taux[1][j]));
    MErci encore pour ton aide

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 11 808
    Points : 27 837
    Points
    27 837
    Billets dans le blog
    2
    Par défaut
    Oui, enfin, attention :

    1. On ne teste jamais l'égalité entre chaînes de caractères avec ==, mais equals(). Tu peux avoir la chance que ça fonctionne si les deux instances sont effectivement les même (ici tu as peut-être cette chance parce que tu construis ta combo avec ton tableau. Il ne faut pas compter sur cette chance.
    2. Ensuite, je ne sais pas pourquoi tu t'évertues à parcourir les deux tableaux.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      for(int i = 0; i < taux.length; i++){			 				  
      	for(int j=0;j < taux[i].length;j++) {
      		if(taux[i][j]==ch) { 	
      		    txtTaux.setText(String.valueOf(taux[1][j]));
                      }
              }
      }
      Il suffit de parcourir le premier qui contient les valeurs de ta combo
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      for(int i=0;i < taux[0].length;i++) {
      		if(taux[0][i].equals(ch)) { 	// si la valeur dans le premier tableau est égale à la valeur choisie
      		    txtTaux.setText(String.valueOf(taux[1][i])); // alors on affiche dans txtTaux, la valeur correspondante dans le second tableau
                      }
              }
    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.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    février 2007
    Messages
    567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 567
    Points : 156
    Points
    156
    Par défaut
    On ne teste jamais l'égalité entre chaînes de caractères avec ==, mais equals(). Tu peux avoir la chance que ça fonctionne si les deux instances sont effectivement les même (ici tu as peut-être cette chance parce que tu construis ta combo avec ton tableau. Il ne faut pas compter sur cette chance.
    Non je ne construit pas ma combo ou liste déroulante avec mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    String[] annees= {"10","15","20","25","30","35","40"};
    		cboAnnees=new JComboBox<String>(annees);
    [*]Ensuite, je ne sais pas pourquoi tu t'évertues à parcourir les deux tableaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int i = 0; i < taux.length; i++){			 				  
    	for(int j=0;j < taux[i].length;j++) {
    		if(taux[i][j]==ch) { 	
    		    txtTaux.setText(String.valueOf(taux[1][j]));
                    }
            }
    }
    Il suffit de parcourir le premier qui contient les valeurs de ta combo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0;i < taux[0].length;i++) {
    		if(taux[0][i].equals(ch)) { 	// si la valeur dans le premier tableau est égale à la valeur choisie
    		    txtTaux.setText(String.valueOf(taux[1][i])); // alors on affiche dans txtTaux, la valeur correspondante dans le second tableau
                    }
            }
    ******************************************************
    Oui effectivement on peut le voir comme ça mais pour moi ça me semble plus logique ou plus adapté de parcourir le deuxième tableau surtout qu'on a "j" à notre disposition.
    Merci encore pour tes remarques et ton aide
    A+

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 11 808
    Points : 27 837
    Points
    27 837
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Oui effectivement on peut le voir comme ça mais pour moi ça me semble plus logique ou plus adapté de parcourir le deuxième tableau surtout qu'on a "j" à notre disposition.
    1. Cela ne l'est pas : on parcourt les structures qui contiennent les données qu'on traite. La tu parcours les deux lignes du tableau, alors que ta donnée en entrée ne fait partie que d'une des deux. Il n'y a rien de logique là dedans. Et quand tu parles de deuxième tableau, je suppose que tu parles de deuxième ligne : c'est encore moins logique, puisqu'elle ne contient justement aucune donnée sélectionnable dans la combo, donc ça ne sert à rien de la parcourir. Cela ne fonctionne que parce que quand tu parcours un tableau où la donnée ne s'y trouve pas, et bah, tu la trouve pas dedans.
    2. Et cet argument du j à dispo n'a rien à voir avec l'histoire. Si tu tiens à le faire avec deux tableaux avec correspondance des index (parce que ce n'est pas la meilleure façon de le faire, il faut le dire), il faut trouver l'index de la valeur en entrée dans le tableau qui contient cette valeur (donc parcourir ce tableau et pas un autre), et sortir la valeur de l'autre tableau à ce même index, qui lui n'a pas besoin d'être parcouru. Le fait d'avoir l'index à disposition ne justifie en rien de parcourir ce tableau.


    Citation Envoyé par xeron33 Voir le message
    Non je ne construit pas ma combo ou liste déroulante avec mon tableau :
    A la limite peu importe. On ne teste pas l'égalité d'instances d'objet avec == (qui est l'opérateur d'identité) mais avec equals(). Cela peut fonctionner parfois, dans certaines conditions, mais ce n'est pas général. Si tu ne veux pas avoir de problème à l'avenir avec des tests d'égalité faux, ne le fais pas, c'est tout.
    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.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    février 2007
    Messages
    567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 567
    Points : 156
    Points
    156
    Par défaut
    [*]Cela ne l'est pas : on parcourt les structures qui contiennent les données qu'on traite. La tu parcours les deux lignes du tableau, alors que ta donnée en entrée ne fait partie que d'une des deux. Il n'y a rien de logique là dedans. Et quand tu parles de deuxième tableau, je suppose que tu parles de deuxième ligne : c'est encore moins logique, puisqu'elle ne contient justement aucune donnée sélectionnable dans la combo, donc ça ne sert à rien de la parcourir. Cela ne fonctionne que parce que quand tu parcours un tableau où la donnée ne s'y trouve pas, et bah, tu la trouve pas dedans.
    [*]Et cet argument du j à dispo n'a rien à voir avec l'histoire. Si tu tiens à le faire avec deux tableaux avec correspondance des index (parce que ce n'est pas la meilleure façon de le faire, il faut le dire), il faut trouver l'index de la valeur en entrée dans le tableau qui contient cette valeur (donc parcourir ce tableau et pas un autre), et sortir la valeur de l'autre tableau à ce même index, qui lui n'a pas besoin d'être parcouru. Le fait d'avoir l'index à disposition ne justifie en rien de parcourir ce tableau.
    Oui effectivement tu as raison j'ai pris un peu de temps ce soir pour le comprendre, ta façon est effectivement plus logique, plus rapide.En tout cas pour ce qui est important c'est tu m'as permis de comprendre le fonctionnement d'un tableau multidimensionnel.
    Merci à toi encore pour le suivi
    A+

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

Discussions similaires

  1. [Collections] lecture tableau 2 dimensions
    Par heloise dans le forum java.util
    Réponses: 2
    Dernier message: 30/09/2004, 10h49
  2. Réponses: 3
    Dernier message: 12/07/2004, 10h53
  3. Tableau à n dimensions
    Par youb dans le forum MFC
    Réponses: 10
    Dernier message: 13/05/2004, 14h13
  4. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50
  5. Réponses: 23
    Dernier message: 21/08/2003, 07h16

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