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 intersection de tableaux


Sujet :

Collection et Stream Java

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut tableau intersection de tableaux
    bonjour !

    Je dois écrire une fonction qui, étant donné deux tabeaux, renvoie un tableau dont les éléments sont ceux communs aux deux tableaux

    Voici mon code en trois étapes :

    Ecrire une fonction qui, étant donné un nombre entier et un tableau de nombres entiers, teste la présence dans le tableau d' au moins un élément
    dont la valeur est le nombre entier

    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
     
    public static boolean nombreDansTableau(int n, int[] tab)
    {
    		boolean verite = false;
     
    		for(int i = 0; i < tab.length; i++)
    		{
    			if(tab[i] == n)
    			{
    				verite = true;
    				break;
    			}
    			else
    			verite = false;
    		}
    		return verite;
    }
    Ensuite

    Ecrire une fonction qui, étant donné 2 tableaux de nombres entiers, renvoie le nombres d' éléments du 1er tableau dont la valeur est égale
    à celle d' au moins un élément du 2ème tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static int nombEltsValeursCommunes(int [] tab1, int [] tab2)
    {
    		int n = 0;
     
    		for(int i = 0; i < tab1.length; i++)
    		{
    			if(nombreDansTableau(tab1[i], tab2))
    			n++;
    		}
    		return n;
    }
    Et enfin,

    Ecrire une fonction qui, étant donné 2 tableaux de nombres entiers, renvoie un tableau dont les éléments ont des valeurs commune aux 2 tableaux


    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
     
    public static int [] tabIntertabs(int [] tab1, int [] tab2)
    {
    		int n = nombEltsValeursCommunes(tab1, tab2);
    		int [] tab = new int [n];
     
    		for(int i = 0; i < tab1.length; i++)
    		{
    			for(int j = 0; j < n; j++)
    			{
    				if( nombreDansTableau(tab1[i], tab2))
    				tab[j] = tab1[i];
     
    				else
    				continue;
    			}
    		}
    		return tab;
    }
    Et c' est la 3ème étape qui cloche. Le tableau renvoyé a le nombre d' éléments attendu. Mais les valeurs attendues sont tous égales à zéro. Or, aucun élément des 2 tableaux n' a la valeur zéro.


    Ce que je vous demande, c' est pas la correction pour l' instant. Mais plutôt me dire là où le bas blesse.
    J' aime plus qu' on me donne la solution toute faite. Je veux une indication sur mon ou mes erreur(s).

    Je vous remercied' avance.

  2. #2
    Membre confirmé Avatar de mattyeux
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 169
    Par défaut
    Ton erreur vient de tes boucles ... Essaye de faire tourner ton algo sur un exemple concret, ou mettre des affichages voir ce qu'il se passe vraiment...
    Ce qui me turlupine c'est qu'a prioris, vu comment est fait ton algo, le tableau retourné ne devrait pas contenir que des 0 mais en réalité, toujours le même nombre ... .

    Bon courage

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut
    j' ai changé l' algo. Cette fois, Le tableau renvoyé a toujours le nombre d' éléments attendu.
    Les deux tableaux en paramètres contiennent 3 valeurs communes. Le tableau INTERSECTION contient les 2 premières valeurs communes. La troisième valeur est égale à zéro. Or, aucun élément des 2 tableaux n' a la valeur zéro.

    Inquiétant ce zéro. N' est-ce pas ?

    Bon, voici le nouveau code de la troisième fonction
    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
     8. Ecrire une fonction qui, étant donné 2 tableaux de nombres entiers, renvoie un tableau dont les éléments ont des valeurs commune aux 2 tableaux
    
    	public static int [] tabIntertabs(int [] tab1, int [] tab2)
    	{
    		int n = nombEltsValeursCommunes(tab1, tab2);
    		int [] tab = new int [n];
    		int j = 0;
    		for(int i = 0; i < tab1.length; i++)
    		{
    			if( nombreDansTableau(tab1[i], tab2))
    			{	
    				tab[j] = tab1[i];
    				j++;
    				
    			}	
                                    else
    				continue;
    		}
    		return tab;
    	}

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Bonjour,

    Le problème viens bien de tes boucles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(int i = 0; i < tab1.length; i++)
    {
    	for(int j = 0; j < n; j++)
    		{
    		if( nombreDansTableau(tab1[i], tab2))
    		tab[j] = tab1[i];
     
    		else
    		continue;
    	}
    }
    Traduis en français, ça veut dire :

    Je boucle dans tab1.
    Pour chaque élément, je boucle autant de fois que j'ai d'éléments communs entre tab1 et tab2.
    Dans chaque boucle, je regarde si l'élément de ma 1ere boucle est dans mon deuxième tableau, si c'est le cas, je le mets dans mon tableau de résultat à l'indice de ma 2eme boucle.

    Ce qui traduit en français français veut dire :

    Je remplis tout mon tableau de résultat avec le dernier élément de tab1 également présent dans tab2.

    Ce qui ne sers pas à grand chose.

    Ta deuxième boucle est inutile donc. Je pense que tu l'avais faite pour incrémenter l'indice de tableau de résultat, mais c'est plutot comme ça qu'il faut faire :

    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
     
    public static int [] tabIntertabs(int [] tab1, int [] tab2)
    {
         //Calcul du nombre d'éléments communs et initialisation du tableau de résultat
         //avec cette taille (jusque là t'avait bon)
         int n = nombEltsValeursCommunes(tab1, tab2);
         int [] tab = new int [n];
     
         //Initialisation d'une variable qui va nous servir à nous positionner dans
         //le tableau de résultat
         int pos = 0;
     
         //Boucle dans le 1er tableau
         for(int i = 0; i < tab1.length; i++)
         {
              //Si le nombre à l'indice i du 1er tableau est aussi présent dans e 2eme tableau
              //on ajoute ce nombre au tableau de résultat
              //et on incrémente notre variable de position(le ++ ne prenant effet qu'après que pos ai été lue)
              if( nombreDansTableau(tab1[i], tab2))
                   tab[pos++] = tab1[i];
         }
         return tab;
    }
    J'en profite pour simplifier ta première méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public static boolean nombreDansTableau(int n, int[] tab)
    	{
    		for(int i = 0; i < tab.length; i++)
    		{
    			if(tab[i] == n)
    				return true;
    		}
    		return false;
    	}
    edit: oups, j'ai été une minute trop long à répondre

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut
    D' abord, y a pas de 2ème boucle.

    Regarde à nouveau ma fonction
    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
     
    public static int [] tabIntertabs(int [] tab1, int [] tab2)
    {
    		int n = nombEltsValeursCommunes(tab1, tab2);
    		int [] tab = new int [n];
    		int j = 0;
    		for(int i = 0; i < tab1.length; i++)// boucle
    		{
    			if( nombreDansTableau(tab1[i], tab2))// pas une boucle
    			{	
    				tab[j] = tab1[i];
    				j++; // juste une incrémentation de cet indice
    // avant de sortir de la véritable boucle. Comme dans un compteur.
     
    			}	else
    				continue;
    		}
    		return tab;
    }
    Ensuite, je suis désolé d' avoir remis l' exo. Y avait une erreur dans mes affections des éléments du tableau. Voici :
    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
     
    int [] tab1 = new int [6];
    		int [] tab2 = new int [6];
     
    		tab1[0] = 21;
    		tab1[1] = 31;
    		tab1[2] = 4;
    		tab1[3] = 11;
    		tab1[4] = 3;
    		tab1[4] = 7;
     
    		tab2[0] = 21;
    		tab2[1] = 1;
    		tab2[2] = 4;
    		tab2[3] = 12;
    		tab2[4] = 3;
    		tab2[4] = 70;
    j' ai mis 2 fois l' indice 4. C' est pourquoi la dernière valeur de l' intersection était égale à zéro.
    En changeant ce qu' il faut, j' ai bel et bien obtenu la bonne réponse.

    Teste ma fonction, ça marche maintenant.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Etrange ton problème de 0, quand je copie ta méthode chez moi(qui fait exactement
    comme la mienne du coup),elle marche nickel.
    Pourrais-tu mettre l'ensemble de tes méthodes ainsi que ta méthode main qu'on puisse tester le tout ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    On vas réussir à communiquer.
    Je parlais de la première version de la fonction, non de la deuxième.
    Et comme je le pensais dans mon post précédent , le problème venait de ta méthode principale.

    Au fait, dans le cas présent,

    ne sert à rien.

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut yusherboy
    Je t' ai envoyé un message privé.

    Pourquoi ne sert à rien ?
    Bien sûr que si !
    Si un élément du tableau tab1 n' a pas la même valeur qu' un élément du tableau tab2, il faut tester avec l' élément suivant de tab1.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Citation Envoyé par raph707
    Je t' ai envoyé un message privé.

    Pourquoi ne sert à rien ?
    Bien sûr que si !
    Si un élément du tableau tab1 n' a pas la même valeur qu' un élément du tableau tab2, il faut tester avec l' élément suivant de tab1.
    Oui, mais non. Quand ta boucle se termine, elle recommence (si elle n'a pas atteint la fin evidemment) sans que tu ai besoin de mettre else...continue.

    Le else...continue, c'est pour faire ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(i=0;i<x;i++)
    {
       traitements;
       ...
     
       if(condition)
          continue;
     
       traitements
       ...
    }
    En gros, c'est une sorte de break sauf que la boucle continue quand même.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Par défaut
    et si ton tableau contient des doublons ca ne marchera pas, tu auras incrémenter ton n plus que ce qu'il faut!!!!!

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

Discussions similaires

  1. [iText] Tableau contenant des tableaux
    Par drizztoli dans le forum Documents
    Réponses: 2
    Dernier message: 01/09/2010, 21h51
  2. Creer un 3ème tableau avec 2 tableaux
    Par anxious dans le forum Langage
    Réponses: 10
    Dernier message: 10/12/2009, 18h00
  3. tableau dynamique de tableaux statiques?
    Par spin6 dans le forum Débuter
    Réponses: 1
    Dernier message: 14/12/2008, 19h47
  4. [Tableaux] Diviser un tableau en sous-tableaux
    Par fayred dans le forum Langage
    Réponses: 5
    Dernier message: 18/03/2008, 16h56
  5. tableau dynamique de tableaux statiques.
    Par RaphAstronome dans le forum C++
    Réponses: 2
    Dernier message: 18/02/2007, 14h43

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