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 :

Lire et remplir un tableau


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    367
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 367
    Par défaut Lire et remplir un tableau
    bonjour

    je souhaite lire un fichier contenant des mots anagrame (c est a dire contenant les memes lettres) et creer une pile triee de chaque type d anagramme ( ex arbre barre et singe signe)

    Donc j ai eu l idee de remplir un tableau et de le trier puis dy comparer mes mots pour remplir mes piles

    Cependant j ai des problemes pour remplir mon fichier grace au split

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    import java.io.*;      // Pour les flux d entrees et sorties
     
    class anagrame{
     
     
     
     
    	static void  lireRemplir(String nomFichier, anagrame [] tableauMots) throws IOException{
     
    		 boolean existeFichier = true ;
    		 FileReader fr = null; // initialiser pour Java
     
    		 int n =0;
     
     
    	     // essayer de LOCALISER le fichier à partir de son nom
    	     try {
    		      fr = new FileReader (nomFichier) ;
    		 }
     
     
    		 // intercepter l'erreur si le fichier n'existe pas
    		 catch ( java.io.FileNotFoundException erreur) {
    			  System.out.println("Probleme d'ouverture du fichier " + nomFichier);
    			  existeFichier = false ; // ajuster
    	     }
     
     
     
    		 if (existeFichier) {
     
    		   	  // construire l'objet d'entrée qui va permettre
    		 	  // d'appliquer la lecture d'une ligne de texte
     
    		 	  BufferedReader entree = new BufferedReader(fr);
    		 	  boolean finFichier = false ;
     
    		 	  while ( !finFichier ) {
     
    		 	  // lire une ligne
    		 	  String uneLigne = entree.readLine();
     
    		 	  if (uneLigne == null)
    		 		   finFichier = true ;
     
    		 	  else {
     
    		 		   String temp[] = uneLigne.split("\t");
    		 	       tableauMots[n++] = temp;
     
    		 	  }
    		 }
     
    	 }
     
    	}

    Mon fichier

    dievor algorithme arbre
    signe chanie ridove enicha brera signer
    voride tset reigne regies
    inache



    logarithme
    chaine aniche
    miare
    singe barre
    ons
    sieger marie
    serveur
    aimer
    test resuver
    armie
    nos
    devoir
    son
    sajolie verseur aslojie geins lajoies

  2. #2
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    import java.io.*;      // Pour les flux d entrees et sorties
    import java.util.*;
     
    public class Anagramme{
     
       static ArrayList lireRemplir(String nomFichier) throws IOException{
     
           boolean existeFichier = true ;
           ArrayList tableauMots = new ArrayList() ;;       
           FileReader fr = null; // initialiser pour Java
     
            // essayer de LOCALISER le fichier à partir de son nom
            try {
                fr = new FileReader (nomFichier) ;
           }
     
     
           // intercepter l'erreur si le fichier n'existe pas
           catch ( java.io.FileNotFoundException erreur) {
               System.out.println("Probleme d'ouverture du fichier " + nomFichier);
               existeFichier = false ; // ajuster
            }
     
     
     
           if (existeFichier) 
           {
     
                 // construire l'objet d'entrée qui va permettre
                // d'appliquer la lecture d'une ligne de texte
     
                BufferedReader entree = new BufferedReader(fr);     
     
                String uneLigne ; 
                String delim = " \t\n";
                StringTokenizer stk ;
                String temp ;
                while ( (uneLigne = entree.readLine()) != null ) 
                {
                	stk = new StringTokenizer(uneLigne,delim);
                    while( stk.hasMoreTokens() )
                    {
                    	temp = stk.nextToken() ;
                    	tableauMots.add(temp);
                    }
     
                }
           }
           return tableauMots ;
        }
     
        public static void main(String [] arghhhhh) // désolé pour le jeu de mot
        {
        	try{
        		ArrayList a = Anagramme.lireRemplir("fichier.txt");    		
        		Object [] obj = a.toArray() ;
        		Arrays.sort(obj);
        		int taille = obj.length  ;
        		for ( int i = 0 ; i < taille ; i++ )
        		{
        			System.out.println(((String)obj[i]).toString() );
        		}
        	}catch(IOException e)
        	{
     
        	}
     
        }
     
       }
    J'ai repris un peu ton code en y ajoutant quelque modification et j'ai utilisé ton fichier de test. J'obtient bien dans tableauMots tous les mots du fichier. J'ai rajouté la méthode pour trier un tableau à la fin, enlève là pour vérifier que tu as bien les mots dans l'ordre, il te reste plus qu'à écrire une méthode pour tester si les mots on bien les mêmes lettres ! voilà

  3. #3
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    367
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 367
    Par défaut
    quand je compile j ai cette erreur la

    anagrame.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    Bonne exécution du processus

  4. #4
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Perso je suis sous eclipse et j'ai pas d'erreur a la compilation, mais vu ton message cherche les méthodes qui sont unsafe !

  5. #5
    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
    Citation Envoyé par harris_macken
    quand je compile j ai cette erreur la

    anagrame.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    Bonne exécution du processus
    Salut,

    Ce n'est pas une erreur mais une note ! Elle n'apparait qu'avec le JDK 5.0 car désormais toutes les classes Collection utilisent les Generics. C'est à dire que tu dois préciser le type d'élément que tu veux traiter, par exemple dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<String> tableauMots = new ArrayList<String>();
    Ainsi le compilateur vérifiera que tu n'ajoutes que des String dans ta liste, et t'évitera de nombreux cast (par exemple la méthode get() renverra un String et non plus un Object).

    Donc tu as 2 solutions :
    [list]- Tu utilises les Generics (mais du coups ton code n'est plus compatible avec les versions de Java inférieur à la version 5.0
    - Tu continues à utiliser les ArrayList sans Générics afin de rester compatible, et dans ce cas soit tu ignores cette note, soit tu compiles avec les options -source 1.4 -target 1.4 afin de générer du code compatible avec Java 1.4...

    a++

  6. #6
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    367
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 367
    Par défaut
    Tout a fait sa marche

    mais je me demande comment peut on comparer les mots pour savoir s il ont exactement les memes caracteres ( ex singe et signe) car avec charAt sa serait presqu impossible d apres moi

  7. #7
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    mais je me demande comment peut on comparer les mots pour savoir s il ont exactement les memes caracteres ( ex singe et signe) car avec charAt sa serait presqu impossible d apres moi
    Pour ma part je ferais de la façon suivante :
    1 - tester si les deux mots a comparer ont la même taille si ce n'est pas le cas ca ne peut pas être des anagrammes
    2 - prendre le premier caractere du mots 1 , le rechercher dans le mots 2 si trouve supprimer le caractere a la fois de la premiere position du mot 1 et a la position trouvé dans le mot 2 et recommencer

    ou sinon une autre solution :

    tu transforme tes deux String en char [] avec getChars(...) tu tries tes deux tableaux tu crée deux nouvelles String avec ces tableaux triés et après tu les compares avec equals ou compareTo et si elles sont égales et bah ce sont des anagrammes !

  8. #8
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    367
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 367
    Par défaut
    bonjour

    j ai essayer tes 2 solutions mais

    avec la premiere j ai un probleme : comment supprimer les caracteres qui existe dans chaque mot

    avec la methode 2 : j ai des problemes pour utiliser le getChars

    donc j ai eu ideed utiliser le hashcode (suis pas trop sur si par exemple singe et signe ont le meme hashcode )

    donc voila le code

    mais sa ne marche pas !!! je sais pas d ou vien mon ereur


    Au fait comment on cree une pile en java ???

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    public static void main(String [] args){// désolé pour le jeu de mot
     
             try{
    		      ArrayList a = Anagramme.lireRemplir("ana.txt");
    		      Object [] obj = a.toArray() ;
    		      Arrays.sort(obj);
                  int taille = obj.length  ;
                  int compteur =0;
     
                  for ( int i = 0 ; i < taille ; i++ ){
     
    				   for(int j =0; j< taille ; j++){
     
    					    if (i != j){
     
    					         if ( ((String) obj[i]).length() == ((String) obj[j]) .length()){
     
    						          if(((String) obj[i]).hashCode() == ((String) obj[j]).hashCode()){
     
    								       System.out.println(((String)obj[i]).toString() );
    								       compteur ++;
    								       System.out.println(((String)obj[j]).toString() );
     
    								   a.remove(i);
    								   a.remove(j);
    								   taille--;
    							 }
    						 }
     
     
    					  }
    				  }
     
     
     
     
     
    			      // System.out.println(((String)obj[i]).toString() );
    			  }
    			  System.out.println("**********" +compteur);
    	     }catch(IOException e){  }
     
     
        }

  9. #9
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    bonjour,
    Citation Envoyé par harris_macken
    j ai essayer tes 2 solutions mais avec la premiere j ai un probleme : comment supprimer les caracteres qui existe dans chaque mot
    avec la methode 2 : j ai des problemes pour utiliser le getChars
    donc j ai eu ideed utiliser le hashcode (suis pas trop sur si par exemple singe et signe ont le meme hashcode )
    Pour supprimer le caractère, tu peux utiliser la méthode substring(). Mais globalement, ça risque de ne pas être très performant. Je pense que la seconde solution serait plus efficace, en utilisant la méthode toCharArray().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char[] chars1 = s1.toCharArray();
    char[] chars2 = s2.toCharArray();
     
    Arrays.sort(chars1);
    Arrays.sort(chars2);
     
    boolean isAnagramme = Arrays.equals(chars1, chars2);
    Sinon, singe et signe n'ont pas le même hashcode.

    Au fait comment on cree une pile en java ???
    java.util.Stack

  10. #10
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    367
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 367
    Par défaut
    Bonjour

    mon code compile mais je veux supprimer le mot lorsqu il a ete consulter et ajouter a la liste afin d eviter les repetions mais quand je fais a.remove(j) j ai un probleme de limite du tableau


    de plus je veux creer une pile pour chaque type d anagramme
    ex singe et signe dans une pile et son et ons dans une autre
    et les afficher qu a la fin??? exemple ce qu

    Nombre de pile : 2

    pile 1 :
    singe
    signe
    esign

    pile 2
    son
    ons
    ...


    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    public static void main(String [] args){// désolé pour le jeu de mot
     
             try{
    		      ArrayList a = Anagramme.lireRemplir("ana.txt");
    		      Object [] obj = a.toArray() ;
    		      Arrays.sort(obj);
                  int taille = obj.length  ;
                  int compteur =0;
     
                  for ( int i = 0 ; i < taille ; i++ ){
     
    				   Stack<Object> p = new Stack<Object>();
    			       p.push(obj[i]);
    			       int compteur2=0;
     
     
    				   for(int j =0; j< taille ; j++){
     
    					    if(i != j && i<j){
     
                                 char[] chars1 = ((String) obj[i]).toCharArray();
                                 char[] chars2 = ((String) obj[j]).toCharArray();
     
                                 Arrays.sort(chars1);
                                 Arrays.sort(chars2);
     
     
     
                                 if( Arrays.equals(chars1, chars2)){
     
    							      compteur ++;
    							      compteur2++;
     
    			                      p.push(obj[j]);
     
     
    						     }
    						}
    				   }
    				   System.out.println("--------Pile-------"+compteur);
     
    				   for (int k =0; k<compteur2; k++){
    					    System.out.println((p.pop()).toString() );
    				   }
     
     
    		      }
     
     
     
     
     
     
    			      // System.out.println(((String)obj[i]).toString() );
     
    			  System.out.println("**********" +compteur);
    	     }catch(IOException e){  }
     
     
        }
    [/quote]

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/02/2006, 00h25
  2. Réponses: 8
    Dernier message: 17/12/2005, 16h39
  3. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 12h43
  4. Remplir un tableau associatif
    Par photorelief dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2005, 18h20
  5. [PHP-JS] Remplir un tableau javascript selon un tableau php
    Par jerome38000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2005, 14h02

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