Partage
  • Partager sur Facebook
  • Partager sur Twitter

Union de deux tableaux

    11 février 2012 à 19:48:38

    Bonsoir à tous et toutes :) ,

    Je cherche à faire une union de deux tableaux d'entier en java, j'ai un peu de mal. Donc ce que j'appelle par union c'est destruction des éléments commun des deux tableaux.

    Il y a quelques choses qui m'échappe sans doute, je vois plus ou moins comment je peux faire mais a mon sens je devrais mettre trop de condition à vérifier, il y a sans doute un moyen plus simple.

    Etant débutant en java je n'ai utilisé que ce que je connais.

    PS : Ne vous étonnez pas du fait que je n'ai pas utilisé de tableau dynamique pour le troisième tableau je m'attaquerai a ce soucis plus tard (chaque chose en son temps :lol: )

    Je vous remercie d'avance et vous souhaite un excellent weekend.

    int tableau1[] = {1, 2, 4, 9, 9, 9, 65, 80, 100, 120, 300};
            int tableau2[] = {2, 6, 8, 9, 9, 70, 301};
            int tableau3[] = new int[20];
    
            int i;
            int i1;
            int i2;
            int i3;
    
    
            //Boucle pour completer le tableau 3 en ordre croissant
            i = 0;
            i1 = 0;
            i2 = 0;
            i3 = 0;
            do {
                if (tableau1[i1] < tableau2[i2]) {
                    tableau3[i3] = tableau1[i1];
                    i1++;
                    i3++;
                } else if (tableau1[i1] > tableau2[i2]) {
                    tableau3[i3] = tableau2[i2];
                    i2++;
                    i3++;
                } else if ((tableau1[i1] == tableau2[i2]) && (tableau1[i1] != tableau3[i3-1])){
                    tableau3[i3] = tableau1[i1];
                    i1++;
                    i2++;
                    i3++;
                } else {
        i1++;
        i2++;
        
    }
    
            } while (i1 < tableau1.length && i2 < tableau2.length);
    
            //On complète la fin du tableau3 si l'un des deux tableaux est plus grand que l'autre
    
            if (i1 < tableau1.length) {
                do {
                    tableau3[i3] = tableau1[i1];
                    i3++;
                    i1++;
                } while (i1 < tableau1.length);
            } else if (i2 < tableau2.length) {
                do {
                    tableau3[i3] = tableau2[i2];
                    i3++;
                    i2++;
    
                } while (i2 < tableau2.length);
            }
    
    
            //Affichage des 3 tableaux
            for (i = 0; i < tableau1.length; i++) {
                System.out.print(tableau1[i] + "\t");
            }
            System.out.println("");
    
            for (i = 0; i < tableau2.length; i++) {
                System.out.print(tableau2[i] + "\t");
            }
            System.out.println("");
    
            for (i = 0; i < tableau3.length; i++) {
                System.out.print(tableau3[i] + "\t");
            }
            System.out.println("");
    


    Donc le soucis ici se situe surtout dans le cas du chiffre 9 qui va se retrouver plusieurs fois dans mon tableau3 ...

    Encore merci :)

    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2012 à 20:26:33

      C'est normal d'avoir ton tableau n°3 de 20 cases alors qu'il n'y a que 18 nombres?

      Je vais essayer de faire quelque chose :)




      Bon finalement je suis parti sur une autre manière de procéder, j'espère que ça te convient : tout d'abord j'ai scindé les deux tableaux, puis j'ai trié. Ça a l'avantage d’être plus court et clair, cependant un peu plus lent surement, remarque ça reste à démontrer.

      public class lettre
      {
      	public static void main (String[] args)
      	{
      		int tableau1[] = {1, 2, 4, 9, 9, 9, 65, 80, 100, 120, 300};
              int tableau2[] = {2, 6, 8, 9, 9, 70, 301};
              int tableau3[] = new int[18];
      
              // on scinde les tableaux sans se préoccuper de l'ordre
              
              int i;
              for (i=0; i<tableau1.length; i++){
              	tableau3[i]= tableau1[i];
              }
              int j;
              for (j = 0;j <tableau2.length ;j++){
              	tableau3[tableau1.length+j] = tableau2[j];
              }
      
              for (i = 0; i < tableau3.length; i++) { // petit affichage
                  System.out.print(tableau3[i] + "\t");
              }
              System.out.println("");
             
              // un petit tri à bulle 
              
              int a;
              boolean v = false; // pour determiner la fin du tri
              while (v==false){
              	v = true;
              	for (i=0;i<17;i++){
              		if (tableau3[i]>tableau3[i+1]){
              			a = tableau3[i+1];
              			tableau3[i+1] = tableau3[i];
              			tableau3[i]= a;
              			v= false;
              		}
              	}
              
              }
      
              for (i = 0; i < tableau3.length; i++) { // on affiche le tout
                  System.out.print(tableau3[i] + "\t");
              }
              System.out.println("");
      
      	}
      }
      
      • Partager sur Facebook
      • Partager sur Twitter
        12 février 2012 à 10:54:52

        Bonjour,

        Et merci pour votre aide :).

        Alors pour répondre a votre question sur la taille du tableau3, je ne m'en suis pas préoccupé car je comptais plus tard essayer de déterminer çà taille de façon dynamique.

        Le deuxième soucis c'est que je ne dois parcourir les tableaux qu'une seule fois.

        J'aime bien votre solution, mais le soucis est toujours là. En fait vous avez fait une fusion (pas de destruction d'élément et non une union.

        Je m'explique donc le résultat pour votre code sera :

        1 2 2 4 6 8 9 9 9 9 9 65 70 80 100 120 300 301

        Et le résultat que je cherche doit être :

        1 2 4 6 8 9 65 70 80 100 120 300 301

        Ceci dit, je cherchais a faire un tri fusion pour mon prochain exercice donc tout n'es pas perdu :) mais cette union me perturbe un peu, je vais sans doute essayer comme vous de joindre d'abord les deux tableaux, même si j'ignore si cela est utile dans le cas ou on a deux tableaux d'origine classé dans l'ordre croissant.

        En tout cas merci beaucoup pour votre aide :) .

        • Partager sur Facebook
        • Partager sur Twitter
          12 février 2012 à 10:58:24

          Donc ce qu'il vous faut c'est qu'une seule fois le terme de chaque liste ordonné en ordre croissant ?

          Assez compliqué pour un debutant :) je vais voir ce que je trouve ce soir ;)
          • Partager sur Facebook
          • Partager sur Twitter
            12 février 2012 à 11:01:35

            Re,

            Oui c'est exact :).

            Je suis rassuré par votre phrase "Assez compliqué pour un debutant :)"


            Merci pour votre aide, je continue a essayer de mon côté :)
            • Partager sur Facebook
            • Partager sur Twitter
              12 février 2012 à 11:08:08

              Si je peux me permettre un conseil ça serai deja de clarifier le fonctionnement de ton algo sur papier ou en comment sur le script (ce que je prefere) c'est plus clair pour tout le monde surtout toi :)

              Petite piste :

              Tu scinde les deux grilles avec trois test : a<b ou on met a puis on avance, b<a la tu auras compris je pense et a=b ou on ne met que a .
              Tu rajoute a ces trois heuristique une autre en amont si a different de c ou si b different de a.

              Je pense que ça devrai marcher :)
              • Partager sur Facebook
              • Partager sur Twitter
                12 février 2012 à 12:26:08

                Re :),

                suivant tes conseils :) voilà à quoi j'ai pensé, cela fonctionne maintenant est ce la manière la plus intelligente de le faire, je ne sais pas... un avis ?

                Je colle mon code ci-dessous :

                int tableau1[] = {1, 2, 4, 9, 9, 9, 65, 80, 100, 120, 300}; // Tableau 1 contenant les éléments sur lesquels effectuer une union
                        int tableau2[] = {2, 6, 8, 9, 9, 70, 301};  // Tableau 2 contenant les éléments sur lesquels effectuer une union
                        int tableau3[] = new int[20];  // Tableau 3 contenant les éléments en union du tableau1 et tableau2
                
                        int i = 0; // Compteur d'itération pour l'affichage des tableaux
                        int i1 = 0;  // Compteur d'itération pour le tableau1
                        int i2 = 0; // Compteur d'itération pour le tableau2
                        int i3 = 0; // Compteur d'itération pour le tableau3
                
                        //Boucle principale pour compléter le tableau3
                        do {
                            //On vérifie que l'élément du tableau1 et du tableau2 ne se trouve pas déjà dans le tableau3
                            if (i3 > 0) {  //Uniquement si le tableau3 a déjà un élément
                                do {
                                    if (tableau1[i1] == tableau3[i3 - 1]) {
                                        i1++;
                                    }
                                    if (tableau2[i2] == tableau3[i3 - 1]) {
                                        i2++;
                                    }
                                } while (tableau1[i1] == tableau3[i3 - 1] || (tableau2[i2] == tableau3[i3 - 1]));
                            }
                            //On compare les éléments du tableau1 et du tableau2 afin de compléter le tableau3 en ordre croissant
                            if (tableau1[i1] < tableau2[i2]) {
                                tableau3[i3] = tableau1[i1];
                                i1++;
                                i3++;
                            } else if (tableau1[i1] > tableau2[i2]) {
                                tableau3[i3] = tableau2[i2];
                                i2++;
                                i3++;
                            } else {
                                tableau3[i3] = tableau1[i1];
                                i1++;
                                i3++;
                            }
                        } while (i1 < tableau1.length && i2 < tableau2.length);
                
                
                        //On complète la fin du tableau3 si l'un des deux tableaux est plus grand que l'autre
                        if (i1 < tableau1.length) {
                            do {
                                tableau3[i3] = tableau1[i1];
                                i3++;
                                i1++;
                            } while (i1 < tableau1.length);
                        } else if (i2 < tableau2.length) {
                            do {
                                tableau3[i3] = tableau2[i2];
                                i3++;
                                i2++;
                
                            } while (i2 < tableau2.length);
                        }
                
                
                        //Affichage des 3 tableaux
                        for (i = 0; i < tableau1.length; i++) {
                            System.out.print(tableau1[i] + "\t");
                        }
                        System.out.println("");
                
                        for (i = 0; i < tableau2.length; i++) {
                            System.out.print(tableau2[i] + "\t");
                        }
                        System.out.println("");
                
                        for (i = 0; i < tableau3.length; i++) {
                            System.out.print(tableau3[i] + "\t");
                        }
                        System.out.println("");
                


                Encore merci :)
                • Partager sur Facebook
                • Partager sur Twitter
                  12 février 2012 à 14:46:54

                  Pour ma part je trouve ça pas mal ce que tu as fais, j'ai presque fini le mien que je vais te passer ça ressemble pas mal la seule différence est que je fais pas deux boucle (pour la partie commune et ce qu'il reste) mais qu'une seule.

                  Tu verras bien mais je pense que ton code est meilleur ;)


                  Le voilà ;) :
                  int tableau1[] = {1, 2, 4, 9, 9, 9, 65, 80, 100, 120, 300};
                          int tableau2[] = {2, 6, 8, 9, 9, 70, 301};
                          int tableau3[] = new int[tableau1.length+tableau2.length];
                    int l1 = tableau1.length;
                    int l2 = tableau2.length;
                    int i1 =0 , i2 =0 , i3 =0;
                    boolean v1 = true , v2 = true; // pour savoir si on a atteint la limite des tableaux
                    
                  do{ // tant que l'un des deux tableaux n'est pas parcouru entierement
                  	 
                  		
                  	  if (v1 && v2){ // si les deux ne sont pas parcourus entierement
                    		if ((tableau1[i1]<tableau2[i2]) ? tableau1[i1] != tableau3[(i3>0)?i3-1 : i3] : tableau2[i2] != tableau3[(i3>0)?i3-1 : i3]){ // si le terme en question n'est pas égal à celui du tableau3
                    			if (tableau1[i1] < tableau2[i2]){ // si a<b
                    				tableau3[i3] = tableau1[i1];
                    				i3++;
                    				i1++;
                    			}
                    			else if (tableau1[i1]>tableau2[i2]){// si b<a
                    				tableau3[i3] = tableau2[i2];
                    				i3++;
                    				i2++;
                    			}
                    			else { // si a==b
                    				tableau3[i3]=tableau1[i1];
                    				i3++;
                    				i2++;
                    				i1++;
                    			}
                    			
                    		}
                    		else if ((tableau1[i1]<tableau2[i2]) ? tableau1[i1] == tableau3[(i3>0)?i3-1 : i3] : tableau2[i2]==tableau3[(i3>0)?i3-1 : i3] ) {// si le terme en question est egal a celui sur le tableau 3
                    			if (tableau1[i1]< tableau2[i2]){ // si a
                    				i1++; 
                    			}
                    			else{ // si b
                    				i2++;
                    		}
                    		}
                  	  }
                  	  else if (v1 && v2 == false) { // si on a fini le tab2
                  		  if ( tableau1[i1] != tableau3[(i3>0)?i3-1 : i3]){ // si le terme n'est pas le meme que dans le tab3
                  			tableau3[i3] = tableau1[i1];
                  		  	i3++;
                  		  	i1++;
                  		  }
                  		  else {// si c'est le cas
                  			  i1++;
                  
                  		  }
                  	  }
                  	  else if (v2 && v1 == false) { // si le tab1 est fini
                  		  if (tableau2[i2] != tableau3[(i3>0)?i3-1 : i3]){ // si le terme n'est pas le meme que dans le tab3
                  			tableau3[i3] = tableau2[i2];
                  		  	i3++;
                  		  	i2++;
                  		  }
                  		  else {// sinon
                  			  i2++;
                  		  }
                  	  }
                  		  
                  	  
                  		if ( i1 == l1){ // si on a fini le tab1 on change la bool
                    			v1 = false;
                    		}
                    		if (i2 ==  l2){ // si on a fini le tab2 on change la bool
                    			v2 = false;
                    		}	 
                  }
                  while(v1 || v2);// fin de boucle
                    
                    //affichage
                          for (int i = 0; i < tableau3.length; i++) { // on affiche le tout
                          	if (tableau3[i]!=0)
                              System.out.print(tableau3[i] + "\t");
                          }
                          System.out.println("");
                  


                  Je pense que ça peut être intéressant pour toi de voir ma réflexion histoire de voir qu'il y avait différentes possibilités :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 février 2012 à 21:14:36

                    Bonsoir,

                    Oui effectivement ça été très intéressant de pouvoir lire ton code, je n'utilise pas encore les bool mais je pense avoir bien compris et je trouve ça bien de pouvoir comparer différente logique / manière de penser.

                    Je te remercie encore pour ton aide, c'est très gentil :) .

                    Excellente soirée.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 février 2012 à 22:04:12

                      Pense a mettre le topic en resolu et n'hesite pas a me contacter si besoin :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 février 2012 à 9:19:27

                        Ok merci,

                        En fait je ne met pas encore le topic sur résolu car il n'est pas vraiment au point, dans le cas ou plusieurs nombre se suive dans des tableaux différents et/ou dans les deux cela ne fonctionne pas. Donc je chercher toujours une solution pour pouvoir la poster ici et enfin clore le sujet comme résolu.

                        Exemple ou cela ne marcherai pas :

                        int tableau1[] = {1, 2, 4, 9, 9, 9, 65, 80, 100, 120, 300, 300, 300};
                        int tableau2[] = {2, 6, 8, 9, 9, 70, 299, 300, 300, 300, 300, 300, 300, 300};
                        


                        Le résultat pour le tableaux 3 devrait être : 1, 2, 4, 6, 8, 9, 65, 70, 80, 100, 120, 299, 300

                        Mais ce n'est pas le cas ...

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 février 2012 à 9:41:07

                          Salut si tu peut utiliser des List dans ce cas essaye ça, cela fait l'union + le tri (la dernière boucle ne sert qu'a l'affichage):
                          public static void unionTab(){
                          		int tableau1[] = {1, 2, 4, 9, 9, 9, 65, 80, 100, 120, 300, 300, 300};
                          		int tableau2[] = {2, 6, 8, 9, 9, 70, 299, 300, 300, 300, 300, 300, 300, 300};
                          		List<Integer> result = new ArrayList<Integer>();
                          		
                          		for(int i=0; i<tableau1.length; i++){
                          			if(!result.contains(tableau1[i])){
                          				result.add(tableau1[i]);
                          			}
                          		}
                          		
                          		for(int i=0; i<tableau2.length; i++){
                          			if(!result.contains(tableau2[i])){
                          				result.add(tableau2[i]);
                          			}
                          		}
                          		
                          		int[] tableau3 = new int[result.size()];
                          		Collections.sort(result);
                          		int index=0;
                          		for (Integer nb : result) {
                          			tableau3[index] = nb.intValue();
                          			index++;
                          		}
                          		
                          		for(int i=0; i<tableau3.length; i++){
                          			System.out.println(tableau3[i]);
                          		}
                          		
                          	}
                          


                          Pour améliorer tu peut faire une méthode qui ce charge de faire la boucle sur un tableau passé en parametre et la liste en parametre qui sera testé et rempli, cela évite la répétition de code.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 février 2012 à 20:35:27

                            Aucun de nos deux algo ne marche? Je pense que le miens devrait ressuir a faire ça non?
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Union de deux tableaux

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown