2010-11-09 2 views
2

Pls Je veux garder un compte de chaque mot d'un fichier, et ce nombre ne doit pas inclure apostrophe, virgule, arrêt complet, point d'interrogation, point d'exclamation, etc. C'est juste des lettres de l'alphabet. J'ai essayé d'utiliser un délimiteur comme celui-ci, mais il n'incluait pas l'apostrophe.Comment puis-je filtrer les lettres non à partir d'un fichier texte en utilisant le délimiteur du scanner, y compris le guillemet simple ou l'apostrophe en Java

Scanner fileScanner = new Scanner("C:\\MyJavaFolder\\JavaAssignment1\\TestFile.txt"); 
    int totalWordCount = 0; 

    //Firstly to count all the words in the file without the restricted characters 
    while (fileScanner.hasNext()) { 
     fileScanner.useDelimiter(("[.,:;()?!\" \t\n\r]+")).next(); 
     totalWordCount++; 
    } 
    System.out.println("There are " + totalWordCount + " word(s)"); 

    //Then later I create an array to store each individual word in the file for counting their lengths. 
    Scanner fileScanner2 = new Scanner("C:\\MyJavaFolder\\JavaAssignment1\\TestFile.txt"); 
    String[] words = new String[totalWordCount]; 
    for (int i = 0; i < totalWordCount; ++i) { 
     words[i] = fileScanner2.useDelimiter(("[.,:;()?!\" \t\n\r]+")).next(); 
    } 

Cela ne semble pas fonctionner!

S'il vous plaît comment puis-je faire à ce sujet?

+0

Cette question a été reformulée en «COMMENT PUIS-JE COMPTER SEULEMENT LES LETTRES DANS UN MOT SÉPARÉ PAR UN APOSTROPHE? 'It's' est un mot de 3 lettres mais en utilisant le délimiteur, il transforme cela en 2 mots de longueur 2 et de longueur 1 respectivement. Autrement dit, COMMENT PUIS-JE SAUTER L'APOSTROPHE LORS DU COMPTAGE? – kooldave98

Répondre

2

Il me semble que vous ne voulez pas filtrer en utilisant autre chose que des espaces et des lignes d'extrémité. Par exemple, le mot "they are" retournera deux mots si vous utilisez un 'pour filtrer votre nombre de mots. Voici comment vous pourriez changer votre code original pour le faire fonctionner.

Scanner fileScanner = new Scanner(new File("C:\\MyJavaFolder\\JavaAssignment1\\TestFile.txt")); 
    int totalWordCount = 0; 
    ArrayList<String> words = new ArrayList<String>(); 

    //Firstly to count all the words in the file without the restricted characters 
    while (fileScanner.hasNext()) { 
     //Add words to an array list so you only have to go through the scanner once 
     words.add(fileScanner.next());//This defaults to whitespace 
     totalWordCount++; 
    } 
    System.out.println("There are " + totalWordCount + " word(s)"); 
    fileScanner.close(); 

Utilisation de la Pattern.compile() transforme votre chaîne en une expression régulière. Le caractère '\ s' est prédéfini dans la classe Pattern pour correspondre à tous les caractères d'espace blanc.

Il y a plus d'informations à Pattern Documentation

Aussi, assurez-vous de fermer les classes du scanner lorsque vous avez terminé. Cela pourrait empêcher votre deuxième scanner de s'ouvrir.

Modifier

Si vous voulez compter les lettres par mot, vous pouvez ajouter le code suivant au code ci-dessus

int totalLetters = 0; 
int[] lettersPerWord = new int[words.size()]; 
for (int wordNum = 0; wordNum < words.size(); wordNum++) 
{ 
String word = words.get(wordNum); 
word = word.replaceAll("[.,:;()?!\" \t\n\r\']+", ""); 
lettersPerWord[wordNum] = word.length(); 
totalLetters = word.length(); 
} 

I ont testé ce code et il semble fonctionner pour moi. Le replaceAll, selon le JavaDoc utilise une expression régulière pour correspondre, il doit donc correspondre à l'un de ces caractères et essentiellement l'enlever.

+0

De bonnes choses surtout avec l'arrayliste ... Je n'y pensais pas. Maintenant, sachant cela, je pense que ma question devrait être reformulée en «COMMENT PUIS-JE COMPTER SEULEMENT LES LETTRES DANS UN MOT SÉPARÉ PAR UN APOSTROPHE? 'It's' est un mot de 3 lettres mais en utilisant le délimiteur, il transforme cela en 2 mots de longueur 2 et de longueur 1 respectivement. Autrement dit, COMMENT PUIS-JE SAUTER L'APOSTROPHE LORS DU COMPTAGE? – kooldave98

+0

J'ai modifié le code afin qu'il fonctionne pour votre problème. Je l'ai testé et ça a l'air de marcher pour moi. – thattolleyguy

+0

Est-ce que cela répond à votre question? – thattolleyguy

1

Le délimiteur n'est pas une expression régulière, donc avec votre exemple, il cherche des choses fractionnés entre "[,:;.!() \" \ T \ n \ r] + »

Vous pouvez soit utiliser regexp au lieu du délimiteur

utilisant la classe regexp avec la méthode de groupe peut être ce que vous cherchez.

String pattern = "(.*)[.,:;()?!\" \t\n\r]+(.*)"; 
Pattern r = Pattern.compile(pattern); 
Matcher m = r.matcher(test); 
    if (m.find()) { 
     System.out.println("Found value: " + m.group(1)); 
    } 

Jouez avec ces classes et vous verrez qu'il est beaucoup plus semblable à ce que vous avez besoin

+0

oh, je ne savais pas que le délimiteur était juste pour chercher des choses réparties entre les choses. Maintenant, sachant cela, je pense que ma question devrait être reformulée en «COMMENT PUIS-JE COMPTER SEULEMENT LES LETTRES DANS UN MOT SÉPARÉ PAR UN APOSTROPHE», par ex. 'It's' est un mot de 3 lettres mais en utilisant le délimiteur, il transforme cela en 2 mots de longueur 2 et de longueur 1 respectivement. Autrement dit, COMMENT PUIS-JE SAUTER L'APOSTROPHE LORS DU COMPTAGE? – kooldave98

0

Vous pouvez essayer cette regex dans votre delimiter: fileScanner.useDelimiter(("[^a-zA-Z]|[^\']")).next();

Cela utilisera tous les caractères non-lettre OU non comme délimiteur apostrophe. De cette façon, vos mots incluront l'apostrophe mais pas n'importe quel autre caractère.

Ensuite, vous devrez parcourir chaque mot et vérifier l'apostrophe et le compte pour eux si vous voulez que la longueur soit précise. Vous pouvez simplement supprimer chaque apostrophe et la longueur correspondra au nombre de lettres dans le mot, ou vous pouvez créer des objets de mot avec leurs propres champs de longueur, de sorte que vous pouvez imprimer le mot tel quel et connaître le nombre de caractères de cette lettre mot.

Questions connexes