如何确定一个单词是否以元音开头

时间:2018-05-04 14:15:57

标签: java

我需要找出一个文件中的单词是否以元音开头,我知道该怎么做但我的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++;
        }
    }

3 个答案:

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