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

Java Discussion :

Éliminer les mots inutiles


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Par défaut Éliminer les mots inutiles
    Bonjour,
    je suis debutante en java , je cherche à créer une classe java qui me permet de supprimer des mots inutile (mot vide) comme : the , that, is, be, before, because, about, then, can,!,?,..... a partir d'un fichier txt .j'ai crée ce code :
    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
     
    public class MotVide {
    	public static void main(String[] args){
    		String fichier ="D:/application/entrer lemm/ambler.txt";
    // exemple d'une liste
    		  ArrayList<String> mots = new ArrayList<String>(Arrays.asList("to", "the", "a","or","on","is","in","be","are","is"));
    		String  ch = "";
    		boolean res ;
    		int j;
     
    		//lecture du fichier texte	
    		try{
    			InputStream ips=new FileInputStream(fichier); 
    			InputStreamReader ipsr=new InputStreamReader(ips);
    			BufferedReader br=new BufferedReader(ipsr);
    			FileWriter fileWriter=new FileWriter("D:\\inputlemma.txt"); 
    			BufferedWriter bufferedWriter=new    BufferedWriter(fileWriter); 
    			String ligne;
     
    			 while ((ligne=br.readLine())!=null ){	
    				System.out.println(ligne);
    				String str[]=ligne.split(" ");
     
    				for (int i =0; i<str.length;i++ )
     
    				{
    				     ch = str[i];
    				     j=0 ;
    				     res =false ;
    				while(j<mots.size() && res ==false)				
    				{   
    					if ( mots.get(j).equalsIgnoreCase(ch))
    				         res= false ; 
    				       else  
    				         res = true ;
    					  j++;
    				}
    				System.out.println(res);
    						 if (res=true)
    				 { bufferedWriter.write(str[i]); 
    				   bufferedWriter.newLine(); }
     
    			   } 
    			 }
    			br.close();	 	
    		}		
    		catch (Exception e){
    			System.out.println(e.toString());
    		}
    	}
    }
    le résultat de code me donner un nouveaux fichier qui contient le même contenue que le fichier initiale, il ne me permet pas d’éliminer les mot vide je pense que la problème dans la fonction equals :
    la variable res prend toujours la valeur true .
    Svp aidez moi !!

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    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 : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Istgas Voir le message
    Bonjour,
    Salut,

    Citation Envoyé par Istgas Voir le message
    la variable res prend toujours la valeur true .
    oui, parce que tu fais :

    or, le symbole de test d'égalité c'est == pas =, qui est le signe d'affectation

    tu devrais faire :

    ou plus simplement

    Quand tu fais

    ça affecte true à res puis ça évalue l'expression res, donc qui vaut toujours true.

    Par ailleurs tu peux remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(j<mots.size() && res ==false)				
    				{   
    					if ( mots.get(j).equalsIgnoreCase(ch))
    				         res= false ; 
    				       else  
    				         res = true ;
    					  j++;
    				}
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res = !mots.contains(ch.toLowerCase())
    (et ce sera un plus efficace d'utiliser un HashSet plutôt qu'une ArrayList pour mots)
    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 du Club
    Femme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Par défaut
    Mercii beacoup sa fonctionne mais lorsque j'ai termine la liste avec des autre mots il ne me donne pas une résulta
    (et ce sera un plus efficace d'utiliser un HashSet plutôt qu'une ArrayList pour mots)
    Est ce que tu me donnée un exemple c 'est quoi HasSet ??

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Pour éviter ce genre d'erreur lors d'un test sur l'égalité, j'ai pris l'habitude de mettre le constant à gauche, comme ça on aura une erreur de compilation au lieu du résultat. En java, l'opérateur "=" ne passe que pour les booléens dans un clause "if" mais l'astuce est valable pour les autres langages.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ("abc".equals(a)) // permet de ne pas tester si a n'est pas null
    if (true=a) // erreur de compilation
    if (2==a) // au lieu de (a==2), dans le cas d'oublie d'un égal (=), on aura une erreur de compilation
    ...
    A+.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    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 : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Istgas Voir le message
    Mercii beacoup sa fonctionne mais lorsque j'ai termine la liste avec des autre mots il ne me donne pas une résulta
    Pas de quoi Mais je ne comprends pas quand tu dis "j'ai termine la liste avec des autres mots"... mets ton code, ce sera plus parlant

    Citation Envoyé par Istgas Voir le message
    Est ce que tu me donnée un exemple c 'est quoi HasSet ??
    Ce n'est pas très important dans ton petit programme, mais quand il s'agit de vérifier l'existence de quelque chose dans un ensemble de valeurs, utiliser un HashSet est plus rapide qu'une ArrayList (c'est d'autant plus important que cette liste est grande).

    Ca s'utilise pareil (si tu utilises contains(), pas si tu utilises ton while et get()) dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set<String> mots = new HashSet<String>(Arrays.asList("to", "the", "a","or","on","is","in","be","are","is"));
    Attention, un HashSet, comme tous les Set impose que les instances que l'on y met soient uniques (au sens de la méthode equals ) : mais c'est le cas d'une liste de stopwords (ça servirait à rien d'avoir 2 fois le même mot)

    Je ne t'explique pas comment fonctionne un HashSet dans le détail, ça risque d'être un petit peu compliqué : sache juste que ça utilise une valeur int (un hash) pour accélérer le test d'égalité (et la recherche), avant de tester equals, d'ou le fait que ça soit plus rapide.
    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.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 122
    Par défaut
    Essai ce code

    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
     
    public class MotVide {
        public static void main(String[] args){
            String fichier ="D:/application/entrer lemm/ambler.txt";
            ArrayList<String> mots = new ArrayList<String>(Arrays.asList("to", "the", "a","or","on","is","in","be","are","is"));
            //lecture du fichier texte	
            try{
                InputStream ips=new FileInputStream(fichier); 
                InputStreamReader ipsr=new InputStreamReader(ips);
                BufferedReader br=new BufferedReader(ipsr);
                FileWriter fileWriter=new FileWriter("D:\\inputlemma.txt"); 
                BufferedWriter bufferedWriter=new    BufferedWriter(fileWriter); 
                String ligne;
     
                 while ((ligne=br.readLine())!=null ){
                    String resultat = "";
                    System.out.println(ligne);
                    String str[]=ligne.split(" ");
     
                    for (int i =0; i<str.length;i++ ){
                         boolean res=false;          
                        for (int k = 0; k < mots.size(); k++) {                                    
                            if ( !mots.get(k).equalsIgnoreCase(str[i])){  
                                res=true; break;       
                            }                                   
                        }
                        if(!res){                   
                                bufferedWriter.write(str[i]+" ");
                                resultat += str[i]+" ";
                        }
                    }
                    System.out.println(resultat);
                    bufferedWriter.newLine();
                 }
                br.close();	 	
            }		
            catch (Exception e){
                    System.out.println(e.toString());
            }
        }
    }
    tes erreurs:
    1-n'emploi pas while si tu peut employer for
    2-tu emploie beucoup trop de variable inutile : ch, j ...

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    @AASProni
    Il faut éviter de manipuler un String pour des concaténations parce que c'est immuable et gardé en mémoire pendant certain temps, il faut utiliser un StringBuilder.

    A+.

Discussions similaires

  1. Le dossier qui stock les mots de passe
    Par cartonis dans le forum Sécurité
    Réponses: 21
    Dernier message: 17/08/2005, 12h49
  2. [sql] [oracle] éliminer les doublons dans sum ?
    Par trungsi dans le forum Langage SQL
    Réponses: 14
    Dernier message: 04/03/2005, 12h29
  3. Enlever les espaces inutiles d'un AnsiString
    Par jamesb dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/01/2005, 12h40
  4. Éliminer les lignes blanches dans un tableau
    Par DenPro dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/11/2004, 01h27
  5. Fusion de lignes de tables en éliminant les redondances
    Par MinsK dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 22/04/2004, 09h21

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