2017-01-10 1 views
0

Je pratique le Java moi-même à partir d'un livre. J'ai lu le chapitre sur le traitement de texte et les classes d'emballage et j'ai tenté l'exercice ci-dessous.Java - Comment délimiter des guillemets simples autour d'une phrase, mais pas une apostrophe dans un mot

Mot Compteur

écrire un programme qui demande à l'utilisateur le nom d'un fichier. Le programme devrait afficher le nombre de mots que le fichier contient. J'ai choisi ce poème aléatoire en ligne pour tester ce programme. Je mets le poème dans un fichier appelé TheSniper.txt:

Two hundred yards away he saw his head; 
He raised his rifle, took quick aim and shot him. 
Two hundred yards away the man dropped dead; 
With bright exulting eye he turned and said, 
'By Jove, I got him!' 
And he was jubilant; had he not won 
The meed of praise his comrades haste to pay? 
He smiled; he could not see what he had done; 
The dead man lay two hundred yards away. 
He could not see the dead, reproachful eyes, 
The youthful face which Death had not defiled 
But had transfigured when he claimed his prize. 
Had he seen this perhaps he had not smiled. 
He could not see the woman as she wept 
To the news two hundred miles away, 
Or through his very dream she would have crept. 
And into all his thoughts by night and day. 
Two hundred yards away, and, bending o'er 
A body in a trench, rough men proclaim 
Sadly, that Fritz, the merry is no more. 
(Or shall we call him Jack? It's all the same.) 

Voici une partie de ma sortie ... Pour des fins de débogage, j'imprimer chaque ligne et les mots dans le fichier jusqu'à y compris ceux du ligne actuelle.

Enter the name of a file: TheSniper.txt 
Two hundred yards away he saw his head; 
Two 
hundred 
yards 
away 
he 
saw 
his 
head 
Line contains 8 words 
He raised his rifle, took quick aim and shot him. 
He 
raised 
his 
rifle 
took 
quick 
aim 
and 
shot 
him 
Line contains 18 words 
... 

À la fin, mon programme affiche que le poème a 176 mots. Cependant, Microsoft Word compte 174 mots. Je vois en imprimant chaque mot que je me trompe d'apostrophes et de guillemets simples. Voici la dernière partie du poème dans ma sortie où le problème se produit:

(Or shall we call him Jack? It's all the same.) 
Or 
shall 
we 
call 
him 
Jack 
It 
s 
all 
the 
same 
Line contains 176 words 
The file has 176 words 

Dans ma liste de paramètres StringTokenizer, quand je ne délimite pas une seule citation, qui ressemble à une apostrophe, le mot « Il est » est compté comme un. Cependant, quand je le fais, il compte comme deux mots (It et s) parce que l'apostrophe, qui ressemble à une seule citation, est délimitée. En outre, la phrase "Par Jove, je l'ai eu!" est mal compté quand je ne délimite pas la citation/apostrophe unique. Est-ce que l'apostrophe et la citation simple ont le même caractère quand il s'agit de les délimiter? Je ne suis pas sûr de savoir comment délimiter des guillemets simples qui entourent une phrase mais pas une apostrophe entre un mot comme "C'est". J'espère que je suis assez clair en posant ma question. S'il vous plaît demander des éclaircissements. Toute orientation est appréciée. Je vous remercie! Pourquoi ne pas utiliser un autre scanner pour chaque ligne pour compter le nombre de mots?

+1

Y at-il des raisons pour lesquelles vous ne pouvez pas utiliser des espaces (espace, tabulation, newline) comme délimiteurs? Dans la phrase «Par Jove, je l'ai eu!», Peu importe si le premier mot est «By» et le dernier est «lui!» À des fins de _counting_ mots, même si ça ne regarde pas aussi agréable lors de l'impression quels mots ont été trouvés (ce qui est seulement pour le débogage, par votre commentaire). (Voir aussi http://stackoverflow.com/questions/8813779/) –

+0

Merci! Ça a du sens. – camelCoder

Répondre

1

Pourquoi ne pas utiliser un autre scanner pour chaque ligne?

int words = 0; 
    while (inputFile.hasNextLine()) { 
     int lineLength = 0; 
     Scanner lineScanner = new Scanner(inputFile.nextLine()); 
     while (lineScanner.hasNext()) { 
      System.out.println(lineScanner.next()); 
      lineLength++; 
     } 
     System.out.println("Line contains " + lineLength + " words"); 
     words += lineLength; 
    } 

Je ne crois pas qu'il soit possible de délimiter une citation unique pour une phrase comme « Bigre, je l'ai! », Mais ignore dans « il est » sauf si vous utilisez une recherche regex ignorer les guillemets simples au milieu d'un mot. Alternativement, vous pouvez traiter les caractères ".!?;,()" Dans le cadre d'un seul mot (par exemple "Jack?" Est un mot), ce qui vous donnera le nombre de mots correct. C'est ce que fait le scanner. Il suffit de changer le délimiteur dans votre StringTokenizer à « » (\ n est pas nécessaire puisque vous êtes déjà la recherche de chaque ligne):

StringTokenizer stringTokenizer = new StringTokenizer(line, " ");