【发布时间】:2012-02-27 13:39:06
【问题描述】:
音节说明:
每组相邻的元音 (a, e, i, o, u, y) 算作一个音节(例如,“real”中的“ea”贡献一个音节,但“e...a”在“富豪”中算作两个音节)。但是,单词末尾的“e”不算作音节。即使前面的规则给出的计数为零,每个单词也至少有一个音节。
我的 countSyllables 方法:
public int countSyllables(String word) {
int count = 0;
word = word.toLowerCase();
for (int i = 0; i < word.length(); i++) {
if (word.charAt(i) == '\"' || word.charAt(i) == '\'' || word.charAt(i) == '-' || word.charAt(i) == ',' || word.charAt(i) == ')' || word.charAt(i) == '(') {
word = word.substring(0,i)+word.substring(i+1, word.length());
}
}
boolean isPrevVowel = false;
for (int j = 0; j < word.length(); j++) {
if (word.contains("a") || word.contains("e") || word.contains("i") || word.contains("o") || word.contains("u")) {
if (isVowel(word.charAt(j)) && !((word.charAt(j) == 'e') && (j == word.length()-1))) {
if (isPrevVowel == false) {
count++;
isPrevVowel = true;
}
} else {
isPrevVowel = false;
}
} else {
count++;
break;
}
}
return count;
}
判断一个字母是否为元音的 isVowel 方法:
public boolean isVowel(char c) {
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
return true;
} else {
return false;
}
}
据一位同事说,这在this text 上使用时应该会产生 528 个音节,但我似乎可以让它等于那个,我不知道我们谁是正确的。请帮助我将我的方法开发成正确的算法或帮助证明这是正确的。谢谢。
【问题讨论】:
-
一个问题是字符串是不可变的。尝试改变 word.toLowerCase(); to word = word.toLowerCase();看看这是否会改变什么。
-
您似乎也在做大量工作来确定字数限制。在此处查找 String 的 split() 方法:docs.oracle.com/javase/7/docs/api/java/lang/…,这可能会为您简化事情。
-
这确实给了我一个不同的(而且可能更正确!)508个音节的结果;仍然不是 528,但我的解决方案现在是正确的还是我同事的 528 结果正确并且我的代码中仍然存在错误?
-
如果这是作业,请标记它--谢谢:)
-
我发现代码相当难以阅读;嵌套很深,一个方法可以做很多工作。如果有更多方法,每个方法做的事情更少,就会更容易理解和修复(或不修复)。