所以 - 我给了两个代码来编写java中的程序来计算字符串中的音节数。代码是:
countSyllables(字符串单词),用于统计单个单词中的音节数
getTokens(String pattern)将字符串的单词分隔为字符串列表
现在,我正在尝试使用两者来计算字符串的音节数。吹嘘是我的代码,在最后两行中有错误。你能说我的逻辑来获得音节的数量是否正确?我怎样才能改进我的代码以获得我想要的结果?
protected int countSyllables1(String doc)
{
//lower all the letters in the string
String inputString = doc.toLowerCase();
// put all the words of the string into a list of strings
List<String> WordTokens = getTokens("[a-zA-Z]+");
//convert the ArrayList to an Array
String[] WordTokensArr = new String[WordTokens.size()];
WordTokensArr = WordTokens.toArray(WordTokensArr);
//Iterate the array
for(String s: WordTokensArr)
{
//count the syllables
int SyllabCount = WordTokenArr.countSyllables(doc);
}
return SyllabCount;
}
以下是我正在使用的帮助代码:
protected int countSyllables(String word) {
String input = word.toLowerCase();
int i = input.length() - 1;
int syllables = 0;
// skip all the e's in the end
while (i >= 0 && input.charAt(i) == 'e') {
i--;
syllables = 1;
}
boolean preVowel = false;
while (i >= 0) {
if (isVowel(input.charAt(i))) {
if (!preVowel) {
syllables++;
preVowel = true;
}
} else {
preVowel = false;
}
i--;
}
return syllables;
}
public boolean isVowel(char ch) {
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' || ch == 'y') {
return true;
}
return false;
}
protected List<String> getTokens(String pattern)
{
ArrayList<String> tokens = new ArrayList<String>();
Pattern tokSplitter = Pattern.compile(pattern);
Matcher m = tokSplitter.matcher(text);
while (m.find()) {
tokens.add(m.group());
}
return tokens;
}
更新
CountSyllables1方法已修改并正在运行。它没有正确检测到音节,但肯定会给出结果。
所以我改变了: 1.我将代码转移到另一个继承自包含CountSyllables和getTokens的类的类。我将方法的名称更改为getNumSyllables()。 2.该方法没有参数(String doc),我还删除了我声明输入字符串的第一行和toLowercase方法,因为此方法已经在CountSyllables类中使用。 3.修改迭代循环,以便声明变量“result”以帮助计算和返回音节数。
public int getNumSyllables()
{
// put all the words of the string into a list of strings
List<String> WordTokens = getTokens("[a-zA-Z]+");
//convert the ArrayList to an Array
String[] WordTokensArr = new String[WordTokens.size()];
WordTokensArr = WordTokens.toArray(WordTokensArr);
//Iterate the array
int result = 0;
for(String s: WordTokensArr)
{
//count the syllables and add to the result sum
result += countSyllables(s);
}
return result;
}
答案 0 :(得分:2)
最后,你迭代单词来计算音节:
for(String s: WordTokensArr) {
int SyllabCount = WordTokenArr.countSyllables(doc);
}
return SyllabCount;
无法在for循环之外访问变量SyllabCount
。即使你在循环之前声明它,你也会覆盖每个单词的值。而是添加每个单词的音节数:
int SyllabCount = 0; // Start with 0.
for(String s: WordTokensArr) {
// Add the amount from this word
SyllabCount = SyllabCount + WordTokenArr.countSyllables(s);
}
return SyllabCount;
答案 1 :(得分:2)
我见过的一些事情:
根本不需要转换arraylist。你可以遍历每个列表!
//convert the ArrayList to an Array
String[] WordTokensArr = new String[WordTokens.size()];
WordTokensArr = WordTokens.toArray(WordTokensArr);
vars通常以小写
开头 int SyllabCount
&#34; WordTokenArr&#34;是一个可怕的类名,因为它表明这实际上是一个WordToken数组而不是一个类。
希望这有助于您的未来:)
答案 2 :(得分:1)
方法countSyllables
在哪里?它似乎是在当前的类中(如果我错了,请纠正我),但是你将它称为String[]
的方法,这是不正确的。此外,您需要将每个单词的音节数加起来并返回它们的总和。
尝试用这个替换你的循环:
//Iterate the array
int result = 0;
for(String s: WordTokensArr)
{
//count the syllables and add to the result sum
result += countSyllables(s);
}
return result;