如何检查字符是否为元音?

时间:2013-10-03 13:47:25

标签: java string char indexof truncation

这个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声明,我无法弄清楚如何检查该行中的所有元音。

8 个答案:

答案 0 :(得分:48)

检查元音的清洁方法:

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

答案 1 :(得分:26)

你的病情有缺陷。想想更简单的版本

z != 'a' || z != 'e'

如果z'a',那么后半部分将为真,因为z不是'e'(即整个条件为真),如果{{1} } z然后前半部分将为真,因为'e'不是z(同样,整个条件为真)。当然,如果'a'既不是z也不是'a',那么这两个部分都将成立。换句话说,你的情况永远不会是假的!

您可能希望'e'代替:

&&

或者也许:

z != 'a' && z != 'e' && ...

答案 2 :(得分:4)

使用正则表达式的方法怎么样?如果使用正确的模式,则可以使用组从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);
}

只是采用一种不同的方法来实现同一目标。

答案 3 :(得分:1)

对于初学者,你正在检查这封信是“不是”或“不是e”还是“不是我”等。

让我们说这封信是我。然后字母不是a,所以返回“True”。然后整个语句为True,因为我!= a。我认为你要找的是和语句一起,而不是OR。

执行此操作后,您需要查看如何递增y并再次检查。如果你第一次得到一个元音,你想看看下一个字符是否也是一个元音。这只检查位置y = 3的字符。

答案 4 :(得分:1)

实际上有更有效的方法来检查它,但既然你已经问过你的问题是什么,我可以说问题是你必须用AND运算符改变那些OR运算符。使用if语句,它始终是真的。

答案 5 :(得分: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);

这是我的答案。

答案 6 :(得分:0)

我已经为VOWELS声明了一个char []常量,然后实现了一个检查char是否是元音的方法(返回一个布尔值)。在我的main方法中,我声明一个字符串并将其转换为一个字符数组,以便我可以将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;
        }
    }

答案 7 :(得分:0)

因此,任何人遇到这种情况时,都想要一种可以在许多情况下使用的简单比较方法。

是大写还是小写都没有关系。 A-Z和a-z。

布尔元音=((1 <<字母)&2130466)!= 0;

这是我能想到的最简单的方法。我在C ++和64位PC上对此进行了测试,因此结果可能有所不同,但是基本上“ 32位整数”中只有32位可用,因为删除了64位和32位,执行时,您将得到1到26之间的值“ <<字母”。

如果您不了解位是如何工作的,对不起,我不会深入探讨

1 << N与2 ^ N幂或创建2的幂相同。

因此,当我们执行1 << N&X时,我们检查是否X中包含创建我们的元音的2的幂位于该值2130466。如果结果不等于0,则说明它是成功的元音。

这种情况可以适用于您使用位的任何情况,并且在这种情况下,只要值的范围是0到31,甚至大于32的值都可以使用。因此,就像前面提到的字母可能是65- 90或97-122,但此后我们一直删除32,直到剩下1-26的余数为止。剩下的并不是它实际如何工作,而是让您对过程有所了解。

如果不能保证传入的字母,请记住该字母是否低于'A'或高于'u'。因为无论如何结果总是错误的。

例如,以下将返回错误的元音正数。 “!”感叹号是值33,它将提供与“ A”或“ a”相同的位值。