这个问题来自 UCSD 的 Java 课程,对吗?
我认为您应该为这个问题提供足够的信息,以免让想要提供帮助的人感到困惑。在这里,我有自己的解决方案,已经通过本地程序的测试用例以及 UCSD 的 OJ 进行了测试。
您错过了有关此问题中音节定义的一些重要信息。 其实我觉得这个问题的关键在于e应该怎么处理。比如假设有te的组合。而如果你把te放在一个单词的中间,当然应该算作一个音节;但是如果在词尾,e 在英文中应该被认为是silent e,所以它不应该被认为是一个音节。
就是这样。我想用一些伪代码写下我的想法:
if(last character is e) {
if(it is silent e at the end of this word) {
remove the silent e;
count the rest part as regular;
} else {
count++;
} else {
count it as regular;
}
}
您可能会发现我不只是使用正则表达式来处理这个问题。其实我想过:这个问题真的可以只用正则表达式来完成吗?我的回答是:不,我不这么认为。至少现在,以 UCSD 为我们提供的知识,要做到这一点太难了。正则表达式是一个强大的工具,它可以非常快速地映射所需的字符。但是正则表达式缺少一些功能。再以te 为例,正则表达式面对teate 之类的词时,将无法三思而后行(这个词我只是举例)。如果我们的正则表达式模式将第一个 te 计为音节,那么为什么最后一个 te 不呢?
同时,UCSD其实已经在作业纸上谈过了:
如果您发现自己在做心理操来想出一个正则表达式来直接计算音节,这通常表明有一个更简单的解决方案(提示:考虑一个字符循环——请参阅下面的下一个提示)。仅仅因为一段代码(例如正则表达式)较短并不意味着它总是更好。
这里的提示是,你应该把这个问题和一些循环一起考虑,结合正则表达式。
好的,我现在终于应该展示我的代码了:
protected int countSyllables(String word)
{
// TODO: Implement this method so that you can call it from the
// getNumSyllables method in BasicDocument (module 1) and
// EfficientDocument (module 2).
int count = 0;
word = word.toLowerCase();
if (word.charAt(word.length()-1) == 'e') {
if (silente(word)){
String newword = word.substring(0, word.length()-1);
count = count + countit(newword);
} else {
count++;
}
} else {
count = count + countit(word);
}
return count;
}
private int countit(String word) {
int count = 0;
Pattern splitter = Pattern.compile("[^aeiouy]*[aeiouy]+");
Matcher m = splitter.matcher(word);
while (m.find()) {
count++;
}
return count;
}
private boolean silente(String word) {
word = word.substring(0, word.length()-1);
Pattern yup = Pattern.compile("[aeiouy]");
Matcher m = yup.matcher(word);
if (m.find()) {
return true;
} else
return false;
}
你可能会发现除了给定的方法countSyllables之外,我还创建了两个额外的方法countit和silente。 countit 用于计算单词中的音节,silente 试图找出以无声e 结尾的单词。并且还应该注意not silent e的定义。例如,the 应视为not silent e,而ate 应视为silent e。
这是我的代码已经通过测试的状态,来自本地测试用例和来自 UCSD 的 OJ:
来自OJ的测试结果:
P.S: 直接使用 [^aeiouy] 之类的应该没问题,因为在我们调用这个方法之前会先解析单词。还需要更改为小写字母,这样可以节省大量处理大写字母的工作。我们想要的只是音节的数量。
说到数字,一个优雅的方法是将count定义为静态,这样私有方法可以直接在里面使用count++。但现在好了。
如果你仍然没有得到这个问题的方法,请随时与我联系:)