2012-02-05 61 views
2

规范音节:爪哇 - 写基于规范的音节计数器

每组相邻元音(A,E,I,O,U,Y)计为一个音节(例如,所述在“真实”中的“ea”贡献了一个音节,但“regal”中的“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; 
     } 
    } 

根据给同事,这将导致在528个音节时在this text上使用,但我似乎可以得到它,我不知道我们哪一个是正确的。请帮助我将我的方法发展为正确的算法或帮助证明这是正确的。谢谢。

+2

一个问题是,字符串是不可变的。尝试改变word.toLowerCase(); to word = word.toLowerCase(); ,看看是否改变任何东西。 – 2012-02-05 23:31:21

+0

你似乎也在做很多确定字数限制的工作。在这里查看String的split()方法:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29并且可能会简化给你的东西。 – 2012-02-05 23:34:56

+0

这确实给了我508个音节的不同结果(也许更加正确!)。仍然不是528虽然我的解决方案现在正确或是我的同事的528结果是正确的,我的代码中仍然存在错误? – mino 2012-02-05 23:35:49

回答

3

其中一个问题可能是您在输入中调用了情人案例方法,但您没有指定它。

所以,如果你改变

word.toLowerCase(); 

word = word.toLowerCase(); 

将帮助是肯定的。

0

我强烈建议您使用Java的字符串API来发挥其全部功能。例如,考虑String.split(字符串正则表达式):

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29

这需要一个字符串,及一个正则表达式,则返回所有的子串的阵列,使用正则表达式作为分隔符。如果你让你的正则表达式匹配所有的辅音或空白,那么你最终会得到一串空的(因此不代表辅音)或一系列元音(代表辅音)的字符串。数了后者,你将有一个解决方案。

另一种选择它也接受字符串API和正则表达式的优点是的replaceAll:

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29

在这种情况下,你想有一个正则表达式,采取的形式[可选的东西是不是元音] [一个或多个元音] [任意不是元音的任何东西]。在你的字符串上运行这个正则表达式,并用一个字符替换它(例如“1”)。最终的结果是,每个音节将被一个单一的字符替换。然后你需要做的就是String.length(),你会知道你有多少个音节。

根据您的解决方案的要求,这些可能无法正常工作。如果这是一个与算法设计有关的作业问题,那么这几乎肯定不是首选答案,但它确实具有简明扼要的优点,并且可以充分利用内置(因此高度优化)的Java API。

0

这应该是一些正则表达式容易可行:

Pattern p = Pattern.compile("[aeiouy]+?\w*?[^e]"); 
String[] result = p.split(WHAT_EVER_THE_INPUT_IS); 
result.length 

请注意,这是未经测试。

0

不是一个直接的答案(如果我认为这是有建设性的,我的计数在最后一次尝试中大约为238),但我会给你一些提示,这将是创建答案的基础:

  1. 划分你的问题:读取行,然后将行分成单词,然后计算每个单词的音节。之后,请将它们统计为所有行。
  2. 想一想事物的顺序:首先找到所有音节,并通过单词“行走”来计算每个音节。事后要考虑特殊情况。
  3. 在设计过程中,使用调试器来遍历代码。机会很高,你会犯类似toUpperCase()方法的常见错误。更好地发现这些错误,没有人会第一次创建完美的代码。
  4. 打印到控制台(高级用户使用日志并在最终程序中保留沉默的日志行)。确保使用注释标记println并将其从最终实施中移除。打印行号和音节数等东西,以便可以直观地将它们与文本进行比较。
  5. 如果您已经升级了一点,您可以使用Matcher.find(正则表达式),使用Pattern来查找音节。正则表达式是困难的野兽掌握。一个常见的错误是让他们做得太多。

这种方式可以快速扫描文本。你很快会发现的一件事是,你将不得不处理文本中的数字。所以你需要检查一个单词是否实际上是一个单词,否则,按照你的规则,它将至少有一个单音节。

如果您觉得自己在重复某些操作,例如使用相同字符集的isVowelString.contains()方法,则可能是做错了。源代码中的重复是代码异味。

使用正则表达式,我计算了大约238(第四次去),但我没有真正检查每个音节(当然)。

1 14 
2 17 
3 17 
4 15 
5 15 
6 14 
7 16 
8 19 
9 17 
10 17 
11 16 
12 19 
13 18 
14 15 
15 18 
16 15 
17 16 
18 17 
19 16 
20 17 
21 17 
22 19 
23 17 
24 16 
25 17 
26 17 
27 16 
28 17 
29 15 
30 17 
31 19 
32 23 
33 0 

--- total --- 
538 
0

我刚刚发明了一种计算Java中音节的新方法。

我的新图书馆,劳伦斯样式检查,在这里可以查看:https://github.com/troywatson/Lawrence-Style-Checker

我用我的程序计算你的音节每个单词和显示结果在这里:http://pastebin.com/LyiBTcbb

随着我计数的字典法音节我得到了:共528个音节。

这是提问者给出的正确音节数的确切数字。但我仍然质疑这个数字,原因如下:

罢工率:99。4%的正确

字错误:337分之2话

字错了,错的音节数:{树脂:4,阿德沃夫:3}

这里是我的代码:

Lawrence lawrence = new Lawrence(); 

    // Turn the text into an array of sentences. 
    String sentences = "" 
    String[] sentences2 = sentences.split("(?<=[a-z])\\.\\s+"); 

    int count = 0; 

    for (String sentence : sentences2) { 
     sentence = sentence.replace("-", " "); // split double words 
     for (String word : sentence.split(" ")) { 

      // Get rid of punctuation marks and spaces. 
      word = lawrence.cleanWord(word); 

      // If the word is null, skip it. 
      if (word.length() < 1) 
       continue; 

      // Print out the word and it's syllable on one line. 
      System.out.print(word + ","); 
      System.out.println(lawrence.getSyllable(word)); 
      count += lawrence.getSyllable(word); 
     } 
    } 
    System.out.println(count); 

嘭!

+0

劳伦斯是基于关键词,而不是基于规则。问题依据规范而不是基于关键字的检查器。 – 2017-05-09 19:29:45

-1

这是我实现计数音节

protected int countSyllables(String word) 
{ 
    // getNumSyllables method in BasicDocument (module 1) and 
    // EfficientDocument (module 2). 
    int syllables = 0; 
    word = word.toLowerCase(); 
    if(word.contains("the ")){ 
     syllables ++; 
    } 
    String[] split = word.split("e!$|e[?]$|e,|e |e[),]|e$"); 

    ArrayList<String> tokens = new ArrayList<String>(); 
    Pattern tokSplitter = Pattern.compile("[aeiouy]+"); 

    for (int i = 0; i < split.length; i++) { 
     String s = split[i]; 
     Matcher m = tokSplitter.matcher(s); 

     while (m.find()) { 
      tokens.add(m.group()); 
     } 
    } 

    syllables += tokens.size(); 
    return syllables; 
} 

它工作正常的我。

0
private static int countSyllables(String word) 
{ 
    //System.out.print("Counting syllables in " + word + "..."); 
    int numSyllables = 0; 
    boolean newSyllable = true; 
    String vowels = "aeiouy"; 
    char[] cArray = word.toCharArray(); 
    for (int i = 0; i < cArray.length; i++) 
    { 
     if (i == cArray.length-1 && Character.toLowerCase(cArray[i]) == 'e' 
       && newSyllable && numSyllables > 0) { 
      numSyllables--; 
     } 
     if (newSyllable && vowels.indexOf(Character.toLowerCase(cArray[i])) >= 0) { 
      newSyllable = false; 
      numSyllables++; 
     } 
     else if (vowels.indexOf(Character.toLowerCase(cArray[i])) < 0) { 
      newSyllable = true; 
     } 
    } 
    //System.out.println("found " + numSyllables); 
    return numSyllables; 
} 

另一种实现可以在以下链接引擎收录中找到: https://pastebin.com/q6rdyaEd