以元音字母顺序排列的单词

6
该程序的目标是从单词列表中返回所有包含6个元音字母(包括y)且按字母顺序排列的单词。例如,答案可能类似于:Aerious(但Aerious不可行,因为它没有y)。目前该程序未返回任何单词。我认为containsVowels方法不正确。
public static void question11() {
    System.out.println("Question 11:");
    System.out.println("All words that have 6 vowels once in alphabetical order: ");
    String vowelWord = "";

    for (int i = 1; i< WordList.numWords(); i++) {
        if (containsVowels(WordList.word(i))) {       
            if (alphabetical(WordList.word(i))) {
                vowelWord = WordList.word(i);
                System.out.println(vowelWord);
            }
        }
    }

    return;
}

public static boolean alphabetical(String word) {
    int vowelPlaceA = 0;
    int vowelPlaceE = 0;
    int vowelPlaceI = 0;
    int vowelPlaceO = 0;
    int vowelPlaceU = 0;
    int vowelPlaceY = 0;

    for (int i = 0; i < word.length(); i++) {
        if (word.charAt(i) == 'a') {
            vowelPlaceA = i;
        }
        if (word.charAt(i) == 'e') {
             vowelPlaceE = i;
        }
        if (word.charAt(i) == 'i') {
             vowelPlaceI = i;
        }
        if (word.charAt(i) == 'o') {
             vowelPlaceO = i;
        }
        if (word.charAt(i) == 'u') {
             vowelPlaceU = i;
        }
        if (word.charAt(i) == 'y') {
             vowelPlaceY = i;
        }
        //check a alphabetical
        if(vowelPlaceA > vowelPlaceE || vowelPlaceA > vowelPlaceI || vowelPlaceA > vowelPlaceO ||
          vowelPlaceA > vowelPlaceU || vowelPlaceA > vowelPlaceY) {
             return false;
        }
        //check e alphabetical
        if(vowelPlaceE > vowelPlaceI || vowelPlaceE > vowelPlaceO ||
          vowelPlaceE > vowelPlaceU || vowelPlaceE > vowelPlaceY) {
             return false;
        }
        //i
        if(vowelPlaceI > vowelPlaceO || vowelPlaceI > vowelPlaceU || vowelPlaceI > vowelPlaceY) {
             return false;
        }
        //o
        if(vowelPlaceO > vowelPlaceU || vowelPlaceO > vowelPlaceY) {
             return false;
        }
        //u
        if(vowelPlaceU > vowelPlaceY) {
             return false;
        }    
    }
    return true;
}

public static boolean containsVowels(String word) {
    String vowels = "aeiouy";
    if (word.contains(vowels)) {
        return true;
    }
    return false;
}

4
containsVowels方法是错误的。你正在检查整个子字符串"aeiouy"。使用循环或正则表达式。 - keyser
contains 只有在字符串包含该字符序列时才返回 true。 - Embattled Swag
1
代码过于复杂,你可以优化逻辑。 - Shoaib Chikate
我知道这样做有些违背初衷,但如果你在现实世界中使用真实的单词,你可能只需将其与已知列表进行比较。根据这个,可能没有太多这样的单词。我相信对于英语以外的语言也是如此。 - Geobits
我建议创建一个Java字符串数组,然后使用for循环遍历数组大小,并检查单词中是否存在任何字母,如果存在,则告诉他们;否则,告诉他们该单词中没有这些字母的识别。 - user2277872
4个回答

7
你可以在你的方法中使用正则表达式:

您可以在方法中简单地使用正则表达式:

public static boolean containsVowels(String word) {
    return Pattern.matches(".*a.*e.*i.*o.*u.*y.*", word);
}

不错,你也应该在“y”后面加上 .*。 - Plux
@Plux:谢谢,我忘了。 - Patrick
干得好,@Patrick。如你所见,我绕来绕去了。+1 并且请随意对我的答案进行踩票。 - Bathsheba
如果性能很重要的话,那么他不应该使用正则表达式,在Java中它的实现非常缓慢:/ 但是只有当单词真的很大才会产生影响。 - Plux
谢谢!这个问题是关于Java的,但是正则表达式给了我在JavaScript中需要使用的提示。 - Eric Hepperle - CodeSlayer2010

3

使用正则表达式

if (word.matches("[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]")){
    //found one
}

[^aeiou]*表示零个或多个辅音;正则表达式中的^表示不匹配[...]中的任何字符。这可能不是最快的解决方案,但很清晰,特别是如果您不像我一样多次硬编码[^aeiou]

编辑:@Patrick的正则表达式更好。


2

如果单词包含“aeiouy”中的任何一个字符,则containsVowels函数将返回true,例如:

"preaeiouy","aeiouypost","preaeiouypost"

以下方法更为准确:

public static boolean containsVowels(String word) {
    String vowels = "aeiouy";
    if (word == null || word.length() < vowels.length())
        return false;
    int counter = 0;
    int vowelCounter = 0;
    //Loop until the whole word has been read, or all vowels found
    while(counter<word.length() && vowelCounter < vowels.length()){
        if (word.charAt(counter) == vowels.charAt(vowelCounter)){
            vowelCounter++;
        }
        counter++;
    }
    return vowelCounter == vowels.length();
}

1
如果字符串为空,则会出现NullPointerException :) - Shoaib Chikate
1
你是对的,已经加入了这个功能,并在任何其他检查之前添加了一个小检查,以确保该单词不比元音单词更小,以便立即返回false :) - Plux

2
没有正则表达式的逻辑。
public static boolean containsVowels(String word) throws NullPointerException {
    List<String> vowels = new ArrayList<String>(
                               Arrays.asList("a", "e", "i", "o", "u", "y"));
    String lastVowel = vowels.get(vowels.size() - 1);
    for (String c : vowels) {
        //false is returned if one vowel can't be found
        if (!word.contains(c)) {
            return false;
        }
        //true is returned once the last vowel is found (as the previous ones)
        if (c.equals(lastVowel)) {
            return true;
        }
    }
    //will never go out of the loop
}

1
包含方法的参数应该是CharSequence类型,而不是Character类型。 - Plux
也要检查空指针异常,这会提升你的代码质量。 - Shoaib Chikate
感谢 @Plux。已将 Character 替换为 String。现在可以处理 CharSequence 了。 - Stéphane Bruckert
这将对任何包含 y 的单词返回 true,而您的元音列表应该是字符串而不是字符,根据您的实现和使用。 - turbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接