c*w 发帖数: 2 | 1 初学java和编程,想请大家指点指点下边这段code有什么办法可以写得更好?
这个方法输入是一个word (String),然后想找到word里有几个音节,规则如下:
1.a,o,u,e,i,y都算元音
2.如果两个或以上元音连续,则只算一个音节
3.如果e是词的最后一个字母,而此外这个词没有别的音节,那这个e不算音节
4.不能用regex,得用loop
int numSyllables(String word)
{
char[] wordarray = word.toCharArray();
int wordcount = 0;
char prev = 0;
for (int i = 0; i < wordarray.length; i++) {
char cur = wordarray[i];
if (i > 0) prev = wordarray[i-1];
if (cur!='e' || i!=wordarray.length-1) {
if ("aoeuiyAOEUIY".contains(""+cur)) {
if (!"aoeuiyAOEUIY".contains(""+prev
)) {
wordcount++;
}
}
} else if (wordcount == 0) {
wordcount++;
}
}
return wordcount;
} |
w**z 发帖数: 8232 | 2 把所有元音放在一个 hashset 里,做check会高效一点。
【在 c*w 的大作中提到】 : 初学java和编程,想请大家指点指点下边这段code有什么办法可以写得更好? : 这个方法输入是一个word (String),然后想找到word里有几个音节,规则如下: : 1.a,o,u,e,i,y都算元音 : 2.如果两个或以上元音连续,则只算一个音节 : 3.如果e是词的最后一个字母,而此外这个词没有别的音节,那这个e不算音节 : 4.不能用regex,得用loop : int numSyllables(String word) : { : char[] wordarray = word.toCharArray(); : int wordcount = 0;
|
s***o 发帖数: 2191 | 3 只用loop大概也就这样了。按我的习惯改一下的话
// not verified
char[] wordarray = word.toCharArray();
int wordcount = 0;
boolean isPreviousVowel = false;
for (int i = 0; i < wordarray.length; i++) {
char cur = wordarray[i];
if (cur == 'e' && i == wordarray.length - 1 && !isPreviousVowel)
{
return wordcount == 0? 0 : wordcount +1;
}
if ("aoeuiyAOEUIY".contains("" + cur)) {
if (!isPreviousVowel) {
wordcount++;
}
isPreviousVowel = true;
} else {
isPreviousVowel = false;
}
}
return wordcount; |
c*w 发帖数: 2 | 4 谢谢你还有楼上wwzz。
对的,我也觉得弄个prev跟踪前一个char有点sloppy,用个flag是清楚多了,多谢指点。
【在 s***o 的大作中提到】 : 只用loop大概也就这样了。按我的习惯改一下的话 : // not verified : char[] wordarray = word.toCharArray(); : int wordcount = 0; : boolean isPreviousVowel = false; : : for (int i = 0; i < wordarray.length; i++) { : char cur = wordarray[i]; : if (cur == 'e' && i == wordarray.length - 1 && !isPreviousVowel) : {
|
s***o 发帖数: 2191 | 5 修改了一下。还是没忍住写了个test case,结果发现条件3有问题 :P
点。
【在 c*w 的大作中提到】 : 谢谢你还有楼上wwzz。 : 对的,我也觉得弄个prev跟踪前一个char有点sloppy,用个flag是清楚多了,多谢指点。
|
s*i 发帖数: 5025 | 6 如果Word就是 e 一个字母,怎么算?
[发表自未名空间手机版 - m.mitbbs.com] |
s*i 发帖数: 5025 | 7 my 2 cents:
1. use charAt(...) instead;
2. use if-test instead of "aoeuiyAOEUIY".contains(...). For example:
boolean isVowel(char c)
{
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c
== 'y' || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' || c ==
'Y';
}
It is ugly but much more efficient.
if you do want to use "aoeuiyAOEUIY".contains(...), declare "aoeuiyAOEUIY"
as a variable before the loop;
[发表自未名空间手机版 - m.mitbbs.com]
【在 c*w 的大作中提到】 : 初学java和编程,想请大家指点指点下边这段code有什么办法可以写得更好? : 这个方法输入是一个word (String),然后想找到word里有几个音节,规则如下: : 1.a,o,u,e,i,y都算元音 : 2.如果两个或以上元音连续,则只算一个音节 : 3.如果e是词的最后一个字母,而此外这个词没有别的音节,那这个e不算音节 : 4.不能用regex,得用loop : int numSyllables(String word) : { : char[] wordarray = word.toCharArray(); : int wordcount = 0;
|
x*****n 发帖数: 98 | 8 use String.valueOf(char) instead of "" + char |
ET 发帖数: 10701 | 9 1 把输入变成lowercase, 比较aoeiu简单些。
2. hashset aoeiu
【在 c*w 的大作中提到】 : 初学java和编程,想请大家指点指点下边这段code有什么办法可以写得更好? : 这个方法输入是一个word (String),然后想找到word里有几个音节,规则如下: : 1.a,o,u,e,i,y都算元音 : 2.如果两个或以上元音连续,则只算一个音节 : 3.如果e是词的最后一个字母,而此外这个词没有别的音节,那这个e不算音节 : 4.不能用regex,得用loop : int numSyllables(String word) : { : char[] wordarray = word.toCharArray(); : int wordcount = 0;
|
n*****t 发帖数: 22014 | 10 其实我更感兴趣的是 regex 怎么写 ^_^
【在 c*w 的大作中提到】 : 初学java和编程,想请大家指点指点下边这段code有什么办法可以写得更好? : 这个方法输入是一个word (String),然后想找到word里有几个音节,规则如下: : 1.a,o,u,e,i,y都算元音 : 2.如果两个或以上元音连续,则只算一个音节 : 3.如果e是词的最后一个字母,而此外这个词没有别的音节,那这个e不算音节 : 4.不能用regex,得用loop : int numSyllables(String word) : { : char[] wordarray = word.toCharArray(); : int wordcount = 0;
|
d***a 发帖数: 13752 | 11 用switch statement实现一个finite state machine,会比较清晰。正规表达式一般是
这样实现的。
【在 c*w 的大作中提到】 : 初学java和编程,想请大家指点指点下边这段code有什么办法可以写得更好? : 这个方法输入是一个word (String),然后想找到word里有几个音节,规则如下: : 1.a,o,u,e,i,y都算元音 : 2.如果两个或以上元音连续,则只算一个音节 : 3.如果e是词的最后一个字母,而此外这个词没有别的音节,那这个e不算音节 : 4.不能用regex,得用loop : int numSyllables(String word) : { : char[] wordarray = word.toCharArray(); : int wordcount = 0;
|