Java - 大字符串中的音节数

时间:2015-12-11 15:22:53

标签: java string arraylist count

所以 - 我给了两个代码来编写java中的程序来计算字符串中的音节数。代码是:

  1. countSyllables(字符串单词),用于统计单个单词中的音节数

  2. getTokens(String pattern)将字符串的单词分隔为字符串列表

  3. 现在,我正在尝试使用两者来计算字符串的音节数。吹嘘是我的代码,在最后两行中有错误。你能说我的逻辑来获得音节的数量是否正确?我怎样才能改进我的代码以获得我想要的结果?

    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;
    
      }
    

3 个答案:

答案 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;