如何检查一个字符是否是元音字母?

18

这段Java代码让我头疼:

    String word = <Uses an input>
    int y = 3;
    char z;
    do {
        z = word.charAt(y);
         if (z!='a' || z!='e' || z!='i' || z!='o' || z!='u')) {
            for (int i = 0; i==y; i++) {
                wordT  = wordT + word.charAt(i);
                } break;
         }
    } while(true);

我想检查一个单词的第三个字母是否为非元音字母。如果是,我希望它返回该非元音字母及其之前的任何字符。如果它是元音字母,则检查字符串中的下一个字母,如果它也是元音字母,则继续检查下一个字母,直到找到一个非元音字母。

示例:

word = Jaemeas,则 wordT 必须 = Jaem

示例2:

word = Jaeoimus,则 wordT 必须 = Jaeoim

问题出在我的 if 语句上,我无法想出如何让它检查该行中的所有元音字母。


5
z!='a'||z!='e'... 这个条件语句将会始终失败。z 不可能同时等于 ae(以及其他字符)。请尝试使用 && 替代。 - xlecoustillier
我想让if语句检查它不是'a''e''i''o''u',我该如何构造这个if语句? - Dinocv
不要忘记 y 元音!而且我有点困惑你的 if 条件:每个字母都不同于 ae 等等...请使用 AND 运算符。 - AlexB
btw: !(a && B) is (!a || !b) - Lescai Ionel
1
@KyleMHB请不要通过编辑来回答您的问题。如果您已经找到了解决方案,请将其作为答案发布在您自己的问题下面。 - Andrew
显示剩余6条评论
8个回答

67

检查元音字母的简洁方法:

public static boolean isVowel(char c) {
  return "AEIOUaeiou".indexOf(c) != -1;
}

37

你的情况存在缺陷。考虑一下更简单的版本。

z != 'a' || z != 'e'
如果z'a',那么第二部分将为真,因为z不等于'e'(即整个条件为真),如果z'e',则第一部分将为真,因为z不等于'a'(同样,整个条件为真)。当然,如果z既不是'a'也不是'e',那么两部分都为真。换句话说,您的条件永远不会为假! 您可能需要使用&&而不是||
z != 'a' && z != 'e' && ...

或许:

"aeiou".indexOf(z) < 0

啊,是的!非常感谢。真不敢相信我竟然没想到那个! - Dinocv
完成了!使用了indexOf()函数,代码更加简洁。 - Dinocv
1
因使用了 indexOf(),所以点赞。这个方法在其他用途方面更加灵活。 - JeffThompson

3
如何使用正则表达式进行翻译?如果您使用正确的模式,可以使用组从Matcher对象中获取结果。在下面的代码示例中,只要有一个模式匹配,对m.group(1)的调用应该会返回您正在寻找的字符串。
String wordT = null;
Pattern patternOne = Pattern.compile("^([\\w]{2}[AEIOUaeiou]*[^AEIOUaeiou]{1}).*");
Matcher m = patternOne.matcher("Jaemeas");
if (m.matches()) {
    wordT = m.group(1);
}

以下方法与之前的目标相同,只是采用了稍微不同的方式。


2

实际上有更有效的方法来检查它,但既然你问了你的问题是什么,我可以告诉你问题是你需要用AND运算符替换那些OR运算符。使用你的if语句,它总是为真。


2
如果有人遇到这个问题并且想要一个简单的比较方法,可以在许多场景中使用。无论是大写还是小写字母,都没有关系。A-Z和a-z。
bool vowel = ((1 << letter) & 2130466) != 0;
这是我能想到的最简单的方法。我在C++和64位PC上测试过,所以结果可能会有所不同,但基本上只有32位可用于“32位整数”,因此位64和位32将被删除,当执行“<
如果您不了解位如何工作,很抱歉我不会深入介绍,但是技术
1 << N与2 ^ N power或创建二次幂相同。
因此,当我们执行1 << N&X时,我们检查X是否包含我们的元音所在的二次幂,该元音位于值2130466中。如果结果不等于0,则成功成为元音。
此情况适用于您使用位和甚至大于32的值的任何内容,只要值的范围为0到31即可。因此,就像前面提到的字母可能是65-90或97-122一样,但由于我们不断删除32,直到我们剩下的余数在1-26之间。余数并不是它实际工作的方式,但它给出了您的思路。
如果您没有保证输入字母,请记住检查字母是否在“ A”以下或在“ u”以上。由于结果总是错误的,因此结果始终为false。
例如,以下内容将返回虚假的元音正面。 “!”感叹号的值为33,它将提供与“A”或“a”相同的位值。

我确实理解比特如何工作,但我不知道你是如何得出2130466掩码的。元音字母在位运算中有什么特殊性吗? - Silviu Burcea

1

首先,你正在检查字母是否为“不是a”或“不是e”或“不是i”等。

假设这个字母是i。那么这个字母不是a,所以返回“True”。然后整个语句是True,因为i!= a。我认为你要找的是将语句AND在一起而不是OR它们。

一旦你这样做了,你需要看一下如何增加y并再次检查这个条件。如果第一次得到一个元音字母,你想看看下一个字符是否也是元音字母,或者不是。这仅检查位置y = 3处的字符。


0
我已经声明了一个 char[] 常量来表示元音字母,然后实现了一个方法来检查一个 char 是否为元音字母(返回一个布尔值)。在我的主方法中,我声明了一个字符串并将其转换为一个字符数组,以便我可以将字符数组的索引作为我的 isVowel 方法的参数传递:
public class FindVowelsInString {

        static final char[] VOWELS = {'a', 'e', 'i', 'o', 'u'};

        public static void main(String[] args) {

            String str = "hello";
            char[] array = str.toCharArray();

            //Check with a consonant
            boolean vowelChecker = FindVowelsInString.isVowel(array[0]);
            System.out.println("Is this a character a vowel?" + vowelChecker);

            //Check with a vowel
            boolean vowelChecker2 = FindVowelsInString.isVowel(array[1]);
            System.out.println("Is this a character a vowel?" + vowelChecker2);

        }

        private static boolean isVowel(char vowel) {
            boolean isVowel = false;
            for (int i = 0; i < FindVowelsInString.getVowel().length; i++) {
                if (FindVowelsInString.getVowel()[i] == vowel) {
                    isVowel = true;
                }
            }
            return isVowel;
        }

        public static char[] getVowel() {
            return FindVowelsInString.VOWELS;
        }
    }

0
 String word="Jaemeas";
 String wordT="";
        int y=3;
        char z;
        do{
            z=word.charAt(y);
             if(z!='a'&&z!='e'&&z!='i'&&z!='o'&&z!='u'&&y<word.length()){
                for(int i = 0; i<=y;i++){
                    wordT=wordT+word.charAt(i);
                    }
            break;
            }
           else{
                 y++;
             }

        }while(true);

这是我的答案。


请解释你的答案,不要只提供一段代码块(你改变了什么,为什么,它是如何工作的)。 - Ben Aubin

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