Partage
  • Partager sur Facebook
  • Partager sur Twitter

arraylist de tableau de char ecrit toujours 2 fois

Sujet résolu
    21 septembre 2023 à 11:33:37

    bonjour

    ci dessous mon code;j essaye de faire un programme qui melange 6 lettres dans toutes les combinaisons possibles

    a chaque combinaison,je veux mettre celle ci dans un array list que j appelle list

    le probleme , c est que la premiere combinaison devrait etre abcdef et la sconde abcdfe;or, il ecrit sur les 2 premieres ligne la meme combinaison , c est a dire abcdfe

    ce code ci dessous est juste un morceau du code global que j ai fait pour avoir tous les melanges

    mais si je vous montrais tous le code , cela ne changerais rien ,j ai toujours 2 lignes en double et  toujours une combinaison sur 2 qui n est pas dans list

    j ai aussi laissé la possibilité de mettre le array en txt ici

    j ai donc un probleme avec mon enregistrement  de mon array ,mais pourquoi ca fait pas ce que je veux?

    merci de votre reponse

    package arraypourforum;
    
    import java.io.FileWriter;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class arraypourforum {
    	static ArrayList<char[]> list = new ArrayList<char[]>();
    	public static void main(String[] args) {
    		int i;int f;
    		char[] recu4= {'a','b','c','d','e','f'};
    		
    		char[] tourner5= new char[6];
    
    		char[] envoi5= new char[6];
    	
    		tourner5[0]=recu4[0];
    		tourner5[1]=recu4[1];
    		tourner5[2]=recu4[2];
    		tourner5[3]=recu4[3];
    		for(i=4 ; i<= 5; i++){
    			f=i+1;
    			
    		
    			tourner5[4]=recu4[i];
    			
    			if((f)==6) {f=4;};			
    			tourner5[5]=recu4[f];
    	
    			envoi5=tourner5;
    			
    			System.out.println(tourner5[0]+" "+tourner5[1]+" "+tourner5[2]+" "+tourner5[3]+" "+tourner5[4]+" "+tourner5[5]);
    			// list.add(tourner5);
               graver(tourner5);
    
    	}
    		System.out.println("La taille de l'ArrayList: " + list.size());
    		char reponse= 'O';
    		char reponse2= 'n';
    		char[]renvoi= new char[6];
    		
    		Scanner sc = new Scanner(System.in);
    		
    		while (!((reponse == 'N')||(reponse == 'n')))
    		{System.out.println("ligne a lire");
    			Scanner sc1 = new Scanner(System.in);
    		int ligne;
    		ligne = sc1.nextInt();
    		renvoi=list.get(ligne);
    		System.out.println(renvoi[0]+" "+renvoi[1]+" "+renvoi[2]+" "+renvoi[3]+" "+renvoi[4]+" "+renvoi[5]);
    		  System.out.println("Voulez-vous réessayer ? (O/N)");
    		  
    		  reponse = sc.nextLine().charAt(0);
    		}
    		System.out.println("Voulez-vous graver dans un fichier txt");
    		reponse2 = sc.nextLine().charAt(0);
    		if (reponse2 == 'o')
    		{  {PrintWriter fich = null;
    		  
    		  try
    	        {fich = new PrintWriter(new FileWriter("C:\\Users\\fini.txt", true));
    	        int u;
    	        for (u=0;u<list.size();u++) {
    	        	renvoi=list.get(u);
    	        fich.println(renvoi);}
    	        }
    	        catch (Exception e) {
    	        	
    	        	}
    	        finally
    	        {
    	            if ( fich != null ) 
    	            {
    	                fich.close();
    	            }
    	        }
    	  
    	  
    	  
    	  }}
    		System.out.println("j ai fini");}
    	static void graver(char[]agraver) {
    		list.add(agraver);
    		return;
    	}
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      22 septembre 2023 à 12:47:50

      vulcain1972 a écrit:

      ci dessous mon code

      ce code ci dessous est juste un morceau du code global que j ai fait pour avoir tous les melanges

      mais si je vous montrais tous le code , cela ne changerais rien ,j ai toujours(etc)


      Bref, tu ne veux pas qu'on cherche dans ton code ce qui pourrait causer le problème. Pour ça il faudrait le code complet, qu'on puisse le faire tourner.

      Tout ce qu'on peut dire, c'est que si ça ne marche pas, c'est qu'il y a sûrement une erreur dans ton code.

      ---

      A ce qu'on voit, il faudrait que tu sépares ton code en méthodes qui ont un rôle clair

      - les données

      - calculer les résultats

      - les afficher

      PS: combinaisons, ou permutations ?

      -
      Edité par michelbillaud 22 septembre 2023 à 12:52:31

      • Partager sur Facebook
      • Partager sur Twitter
        25 septembre 2023 à 19:16:43

        salut

        ce code là provoque le meme probleme que mon programme general

        a la reflexion, c etait meme inutile que je dise  qu il y avait un autre programme;quand on execute celui que je montre le probleme se produit

        de plus ,si là c est pas assez clair ,je vous laisse imaginer si j avais mis un code de 600 lignes fait par moi,qui ne suit qu un debutant

        combinaisons ou permutations;sans doute faut il appeler ca permutations,si vous trouvez que ca a de l importance,mais ce que je veux dire c est que sur ma console ,quand je lance ce code ,ma ligne "system out print" ligne 33 affiche ABCDEF puis ABCDFE alors que lorsque je veux lire mon array lisyt ligne 51 et que je demande la "ligne 0" de l array list je devrais avoir comme reponse ABCDEF et j ai ABCDFE;si je demande la "ligne 1" j ai aussi la reponse ABCDFE;et lorsque je cree un fichier txt pour avoir mon arry list en "dur " ,j ai 2 lignes ABCDFE au lieu d avoir une premiere ligne ABCDEF puis ABCDFE

        voila ,merci de votre patience pour essayer de comprendre mon probleme

        • Partager sur Facebook
        • Partager sur Twitter
          26 septembre 2023 à 8:59:08

          On a compris ton problème  : il y a une erreur dans ton code.

          On a même la solution, il faut le corriger.

          Mais bon, essaie de localiser l'erreur. C'est dans la fabrication du résultat, ou son enregistrement ?

          Ça serait plus facile pour toi si tu restructurais ton code, mais après tout, si tu ne veux pas tenir compte de de qu'on te dit, c'est toi qui vois. Déjà, si il était indenté correctement. Là c'est illisible.

          Autre chose : faut commencer petit. Écrire le code pour les permutations de 3 éléments (*). Et si ça marche pas ça sera facile de le suivre à la main pour voir où ça déconne.

          (*) Plus exactement, une méthode qui fait les permutations sur un nombre quelconque d'éléments. En la testant sur 3, ou 2, éléments pour commencer.

          ----


          Il est bien possible que la cause du problème, c'est que chaque fois que tu passes ligne 35, tu ajoute dans list la référence  du même tableau "tourner5" (quel nom à la noix).

          Ca se voit en exécutant une version réduite et nettoyée du début de ton programme

          import java.util.ArrayList;
          
          public class ArrayPourForum {
          
              static ArrayList<char[]> list = new ArrayList<>();
          
              public static void main(String[] args) {
                  char[] recu4 = {'a', 'b', 'c', 'd', 'e', 'f'};
                  char[] tourner5 = new char[6];
          
                  tourner5[0] = recu4[0];
                  tourner5[1] = recu4[1];
                  tourner5[2] = recu4[2];
                  tourner5[3] = recu4[3];
                  for (int i = 4; i <= 5; i++) {
                      int f = i + 1;
                      tourner5[4] = recu4[i];
                      if (f == 6) {
                          f = 4;
                      }
                      tourner5[5] = recu4[f];
          
                      System.out.println(tourner5);
                      list.add(tourner5);
                  }
                  System.out.println("La taille de l'ArrayList: " + list.size());
                  for (var element : list) {
                      System.out.println("référence -> " + element);
                  }
              }
          }
          


          Execution

          $ java ArrayPourForum 
          abcdef
          abcdfe
          La taille de l'ArrayList: 2
          référence -> [C@14dad5dc
          référence -> [C@14dad5dc
          


          Ce que tu vois, c'est deux fois le contenu final de tourner5

          ---

          si on fait ajouter une copie du tableau, à chaque fois les copies sont des objets différents

          list.add(tourner5.clone());


          C'est pas pareil

                System.out.println("La taille de l'ArrayList: " + list.size());
                  for (var element : list) {
                      System.out.println("référence -> " + element);
                      System.out.println(element);
                  }
          La taille de l'ArrayList: 2
          référence -> [C@14dad5dc
          abcdef
          référence -> [C@18b4aac2
          abcdfe
          



          A part ça, l'algorithme, ça sera une autre histoire.

          -
          Edité par michelbillaud 26 septembre 2023 à 16:42:49

          • Partager sur Facebook
          • Partager sur Twitter
            26 septembre 2023 à 19:02:42

            bonjour

            merci pour la reponse michelbillaud

            effectivement , ca marche;pour ma part ,je pensais, a tort que lorsque je faisais list.add (tourner 5),je rajouterais a chaque passage sur cette ligne une nouvelle ligne dans l array list ou il y avait le tableau tourner5 "en cours"pour ainsi dire;je ne connaissais pas le coup de la copie,et je ne l aurais pas trouvé sans ton aide

            quand aux erreurs de restructuration et autre, je sais que mes codes sont pas conformes aux bonnes pratiques des vrais programmeurs ;desolé si ca pique les yeux,faut que je progresse aussi la dessus;a ma decharge ,je fais ca vraiment par hobby et defi personnel;mais quand je bloque je fais un petit extrait de code de mon probleme,pensant que c est clair;desolé si ca l est pas

            merci encore

            • Partager sur Facebook
            • Partager sur Twitter
              27 septembre 2023 à 12:11:41

              Non seulement c'est "pas conforme aux bonnes pratiques des vrais programmeurs professionnels de la profession", mais même pour un amateur débutant,  c'est du boulot crado. (*)

              Si je dis ça, c'est pas pour faire plaisir aux professionnels qui regarderaient ton code d'un oeil condescendant, c'est pour que TOI tu t'y retrouves dans ton propre code. Faut s'en occuper de suite, sinon tu va galérer encore plus.

              C'est pas une question de goût ou d' esthétique. Travailler sur du code avec par exemple des variables mal nommées, ça te requisitionne quelques neurones qui seraient beaucoup mieux utilisés à autre chose. Et on n'en n'a pas tant que ça. Probleme de charge cognitive, on peut pas garder plus d'une demi-douzaine de trucs en tete. C'est pour ça qu'on bloque.

              Et le professionnel, si il bloque moins, c'est parce qu'il fait gaffe à organiser ce qu'il écrit. Ce n'est pas une qualité surnaturelle qui lui est tombé du ciel, il a appris à le faire, en étant débutant lui-aussi. Donc faut s'y mettre, et maintenant.

              (*) ceci pour couper court à l'idée que tu t'occuperas de faire mieux quand tu sera grand, mais que t'es pas concerné et que ça va comme ça

              -
              Edité par michelbillaud 29 septembre 2023 à 9:27:05

              • Partager sur Facebook
              • Partager sur Twitter

              arraylist de tableau de char ecrit toujours 2 fois

              × 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