2012-12-12 2 views
1

Le programme que j'essaie de créer est un programme qui extrait des mots d'un fichier défini par l'utilisateur, enregistre ces mots sous forme de variables et recherche dans un autre fichier défini par l'utilisateur mots, en sortie là-bas.Recherche simultanée de plusieurs mots dans un fichier externe (Java)

Le programme fonctionne jusqu'à et y compris le point où le programme prend les mots et les enregistre en tant que variables. Le problème avec le programme est que la méthode de recherche renvoie un résultat nul. Mes principaux soupçons sont que le code dans la méthode de recherche est incompatible avec le code dans la méthode de lecture, ou que les 2 méthodes ne sont pas exécutées simultanément.

La méthode de recherche est dans la classe de recherche et la méthode de lecture est dans la classe de lecture.

Voici mon code (Contenant tous les 3 de mes classes), veuillez excuser toutes les importations.

Ceci est la première classe:

import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class Combination{ 

    public static void main(String[] args) throws FileNotFoundException{ 

    Scanner userInput = new Scanner(System.in); 
    Reading ReadingObject = new Reading();   
    System.out.println("Please enter the file that you wish to open"); 
    String temp = userInput.nextLine(); 
    ReadingObject.setFileName(temp); 
    ReadingObject.read(); 
    Scanner searchForWord = new Scanner(System.in); 
    Searching SearchingObject = new Searching(); 
    System.out.println("Please enter the file that you would like to search for these words in"); 
    String temp1 = searchForWord.nextLine(); 
    SearchingObject.setFileName(temp1); 
    SearchingObject.search(); 

}  
} 

C'est la deuxième classe:

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 

class Reading { 
private String file; 
public void setFileName(String fileName){ 
    file = fileName; 
} 
public String getFileName(){ 
    return file; 
} 
public void read(){ 
    try{ 
     //Choosing the file to open 
     FileInputStream fstream = new FileInputStream(getFileName()); 

     //Get the object of datainputstream 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine = null; 

     //Read the file line by line 
     while((strLine = br.readLine()) != null){ 
      //  \\s+ means any number of whitespaces between tokens 
      String [] tokens = strLine.split("\\s+"); 
      String [] words = tokens; 
      for(String word : words){ 
       System.out.print(word); 
       System.out.print(" "); 

       Searching SearchingObject = new Searching(); 
       SearchingObject.setWord(word); 
      } 
      System.out.print("\n"); 
     } 
     in.close(); 
    } 
    catch(Exception e){ 
     System.err.println("Error: " + e.getMessage()); 
    } 
} 
} 

C'est la troisième classe:

import java.io.*; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

class Searching { 
private String file1; 
public void setFileName(String fileName){ 
    file1 = fileName; 
} 
public String getFileName(){ 
    return file1; 
} 
private String word1; 
public void setWord(String wordName){ 
    word1 = wordName;  
} 
public String getWord(){ 
    return word1; 
} 

public void search() throws FileNotFoundException{ 

    try{ 
     //Choosing the file to open 
     FileInputStream fstream = new FileInputStream(getFileName()); 

     //Get the object of datainputstream 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine = null; 

     while((strLine = br.readLine()) != null){ 

      Pattern p = Pattern.compile(getWord()); 
      Matcher m = p.matcher(strLine); 

     int start = 0; 
     while (m.find(start)) { 
      System.out.printf("Word found: %s at index %d to %d.%n", m.group(), m.start(), m.end()); 
      start = m.end(); 
       } 
      }   
    } 
    catch(Exception e){ 
     System.err.println("Error: " + e.getMessage()); 
    } 
} 
} 

Toute aide sera grandement appréciée.

Observe

+0

Suivez les conventions: ClasNamesStartWithCaps, variablesDoNot. Ils rendent votre code plus facile à lire. – tucuxi

+0

En outre, vous collez plusieurs classes dans un extrait de code unique. Créez plusieurs extraits ou transformez les classes supplémentaires en classes internes statiques. – tucuxi

+0

Merci pour les conseils. Je suis nouveau à la programmation et ce site. J'ai fait des ajustements en conséquence sauf pour la capitalisation variable. Est-ce que le code est facile à voir si je le présente séparément à chaque classe? – Digitalwolf

Répondre

1

Votre code est difficile à lire. Votre classe reading ne lit pas seulement; il cherche aussi. Vous devriez l'appeler quelque chose qui reflète son utilisation prévue. Cependant, il oublie de dire à son objet searching où chercher et ne transmet la référence à cet objet à personne d'autre. Dans cet extrait

for (String word : words) { 
    System.out.print(word); 
    System.out.print(" "); 

    searching searchingObject = new searching(); 
    searchingObject.setWord(word); 
} 

vous ne faites pratiquement rien. La référence à searchingObject est perdue pour toujours.

Votre classe reading doit conserver une ArrayList de mots à rechercher dans le searching, au lieu d'instancer la recherche d'objets. Votre classe searching doit prendre, en tant que paramètre constructeur, l'une de ces ArrayLists - et la convertir en une seule regex, ce qui est beaucoup plus efficace que de lire le fichier une fois par mot à rechercher. Vous pouvez rechercher "a", "b" et "c" en utilisant l'expression régulière "a | b | c". Fonctionne avec des mots plus longs, aussi. Échappez-les d'abord pour éviter les problèmes.

Oh, et s'il vous plaît, suivez les directives de dénomination. Appelez votre reading un TokenReader, et votre searching un WordListSearcher ...

+0

Si vous n'avez pas besoin de rechercher des motifs complexes, et que vous êtes uniquement intéressé par des mots à orthographe exacte, utilisez la méthode .contains (word) de HashSet au lieu des expressions régulières. Plus rapide et plus facile à lire et pas de problèmes avec les expressions régulières – tucuxi

+0

Merci pour le conseil. Désolé pour les directives de nommage, je suis nouveau à Java et tout ce que je sais est autodidacte. Je n'avais pas l'intention de faire des recherches dans ma classe "lecture" et j'étais d'avis qu'en ajoutant l'objet de recherche, je permettais à ma classe de recherche d'accéder à la classe de lecture. Votre réponse résout ma requête, et je vois mes erreurs. Regards – Digitalwolf

+0

Re Java: la meilleure façon d'apprendre un langage de programmation est de voir ce que font les bons développeurs. Dans NetBeans, vous pouvez Ctrl + clic sur * n'importe quel nom de classe et voir la source d'où il vient. Regardez la source pour les bibliothèques standard - String, System, File, ... - ce sont de très bons exemples. – tucuxi

Questions connexes