我需要找出一个文件中的单词是否以元音开头,我知道该怎么做但我的if语句效率非常低。我必须将我的tokenizer中的单词放入arrayList中,然后使用if语句使用.startsWith()5次不同的时间来计算每个元音。是否有更快的方法可以做到这一点?
while (s.hasMoreTokens()){
word = s.nextToken();
list.add(word);
if (list.get(i).startsWith("a")||list.get(i).startsWith("e")||list.get(i).startsWith("i")||list.get(i).startsWith("o")||list.get(i).startsWith("u")) {
vowelCount++;
}
}
答案 0 :(得分:1)
嗯,你可能有3个不同的目标:
1)语言敏感吗?如果是这样,元音的概念很棘手,可能会被委托给一些国际化(i18n)讨厌的东西,我不会在这里讨论。
2)严密的代码,但不一定更快:
boolean startWithVowel(String word) {
return "eaiouEAIOU".indexOf(word.charAt(0)) >=0
}
3)快速但冗长的代码:
boolean startWithVowel(String word) {
switch(word.charAt(0)) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return true;
default:
return false;
}
}
或
//in class definition:
static final boolean[] vowels = new byte['u'+1];
static {
vowels['a'] = vowels['A'] = vowels['e'] = vowels['E'] = ..... = true;
}
boolean startWithVowel(String word) {
int index = word.chartAt(0);
return index<='u' && vowels[index]);
}
当然,请允许像word.lenght&gt; 0这样的完整性检查。 (无论你做什么,如果速度是一个问题,请避免正则表达式)
答案 1 :(得分:0)
您的元音与支票无关。首先为它创建新的Set<Char>
然后你可以使用字符串的第一个字符进行测试:
Set<Char> vowels = new HashSet<>(Arrays.asList('e', 'i', ...));
while (s.hasMoreTokens()){
word = s.nextToken();
list.add(word);
if (word.length() > 0 && vowels.contains(word.charAt(0))) {
vowelCount++;
}
}
答案 2 :(得分:0)
我认为最好的方法是:
while (s.hasMoreTokens()) {
word = s.nextToken();
list.add(word);
switch (word.charAt(0)) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
// do something
break;
default:
break;
}
}