1 /**
2 This class describes words in a document. There are a couple
3 of bugs in this class.
4 */
5 public class Word
6 {
7 private String text;
8
9 /**
10 Constructs a word by removing leading and trailing non-
11 letter characters, such as punctuation marks.
12 @param s the input string
13 */
14 public Word(String s)
15 {
16 int i = 0;
17 while (i < s.length() && !Character.isLetter(s.charAt(i)))
18 {
19 i++;
20 }
21 int j = s.length() - 1;
22 while (j > i && !Character.isLetter(s.charAt(j)))
23 {
24 j--;
25 }
26 text = s.substring(i, j);
27 }
28
29 /**
30 Returns the text of the word, after removal of the
31 leading and trailing non-letter characters.
32 @return the text of the word
33 */
34 public String getText()
35 {
36 return text;
37 }
38
39 /**
40 Counts the syllables in the word.
41 @return the syllable count
42 */
43 public int countSyllables()
44 {
45 int count = 0;
46 int end = text.length() - 1;
47 if (end < 0) { return 0; } // The empty string has no syllables
48
49 // An e at the end of the word doesn't count as a vowel
50 char ch = text.charAt(end);
51 if (ch == 'e' || ch == 'E') { end--; }
52
53 boolean insideVowelGroup = false;
54 for (int i = 0; i <= end; i++)
55 {
56 ch = text.charAt(i);
57 String vowels = "aeiouyAEIOUY";
58 if (vowels.indexOf(ch) >= 0)
59 {
60 // ch is a vowel
61 if (!insideVowelGroup)
62 {
63 // Start of new vowel group
64 count++;
65 insideVowelGroup = true;
66 }
67 }
68 }
69
70 // Every word has at least one syllable
71 if (count == 0) { count = 1; }
72
73 return count;
74 }
75 }