How do I check if a char is a vowel?

75,379

Solution 1

Your condition is flawed. Think about the simpler version

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

If z is 'a' then the second half will be true since z is not 'e' (i.e. the whole condition is true), and if z is 'e' then the first half will be true since z is not 'a' (again, whole condition true). Of course, if z is neither 'a' nor 'e' then both parts will be true. In other words, your condition will never be false!

You likely want &&s there instead:

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

Or perhaps:

"aeiou".indexOf(z) < 0

Solution 2

Clean method to check for vowels:

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

Solution 3

How about an approach using regular expressions? If you use the proper pattern you can get the results from the Matcher object using groups. In the code sample below the call to m.group(1) should return you the string you're looking for as long as there's a pattern match.

String wordT = null;
Pattern patternOne = Pattern.compile("^([\\w]{2}[AEIOUaeiou]*[^AEIOUaeiou]{1}).*");
Matcher m = patternOne.matcher("Jaemeas");
if (m.matches()) {
    wordT = m.group(1);
}

Just a little different approach that accomplishes the same goal.

Solution 4

Actually there are much more efficient ways to check it but since you've asked what is the problem with yours, I can tell that the problem is you have to change those OR operators with AND operators. With your if statement, it will always be true.

Solution 5

So in event anyone ever comes across this and wants a easy compare method that can be used in many scenarios.

Doesn't matter if it is UPPERCASE or lowercase. A-Z and a-z.

bool vowel = ((1 << letter) & 2130466) != 0;

This is the easiest way I could think of. I tested this in C++ and on a 64bit PC so results may differ but basically there's only 32 bits available in a "32 bit integer" as such bit 64 and bit 32 get removed and you are left with a value from 1 - 26 when performing the "<< letter".

If you don't understand how bits work sorry i'm not going go super in depth but the technique of

1 << N is the same thing as 2^N power or creating a power of two.

So when we do 1 << N & X we checking if X contains the power of two that creates our vowel is located in this value 2130466. If the result doesn't equal 0 then it was successfully a vowel.

This situation can apply to anything you use bits for and even values larger then 32 for an index will work in this case so long as the range of values is 0 to 31. So like the letters as mentioned before might be 65-90 or 97-122 but since but we keep remove 32 until we are left with a remainder ranging from 1-26. The remainder isn't how it actually works, but it gives you an idea of the process.

Something to keep in mind if you have no guarantee on the incoming letters it to check if the letter is below 'A' or above 'u'. As the results will always be false anyways.

For example teh following will return a false vowel positive. "!" exclamation point is value 33 and it will provide the same bit value as 'A' or 'a' would.

Share:
75,379

Related videos on Youtube

Dinocv
Author by

Dinocv

Updated on July 09, 2022

Comments

  • Dinocv
    Dinocv almost 2 years

    This Java code is giving me trouble:

        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);
    

    I want to check if the third letter of word is a non-vowel, and if it is I want it to return the non-vowel and any characters preceding it. If it is a vowel, it checks the next letter in the string, if it's also a vowel then it checks the next one until it finds a non-vowel.

    Example:

    word = Jaemeas then wordT must = Jaem

    Example 2:

    word=Jaeoimus then wordT must =Jaeoim

    The problem is with my if statement, I can't figure out how to make it check all the vowels in that one line.

    • xlecoustillier
      xlecoustillier over 10 years
      z!='a'||z!='e'... will always fail. z can't be equal to a and e (and so on) at the same time. Try && instead.
    • Dinocv
      Dinocv over 10 years
      I wanted the if to check that it wasnt 'a' 'e' 'i' 'o' 'u', how do I structure that if statement?
    • xlecoustillier
      xlecoustillier over 10 years
      It's this one. But you seen AND.
    • AlexB
      AlexB over 10 years
      Don't forget yvowel ! And I'm a little bit confused about your if condition : every letter is differeent from a OR e etc... Use AND operator instead
    • Sid
      Sid over 10 years
      @X.L.Ant Isn't || the OR logic? I guess that statement will pass.
    • xlecoustillier
      xlecoustillier over 10 years
      @Sid Yeah sorry, I said 'fail', that's the other way around. The point is that this test is flawed.
    • Lescai Ionel
      Lescai Ionel over 10 years
      btw: !(a && B) is (!a || !b)
    • Dinocv
      Dinocv over 10 years
      Yeah thanks guys I sorted it out, it was supposed to us an AND not an OR. However if you see the answer I selected the "AEIOUaeiou".indexOf(z) <0 is a much cleaner solution
    • Jim Dagg
      Jim Dagg over 10 years
      @KyleMHB Those nots make the logic weird -- what bit you was DeMorgan's Laws. Good thing to refresh yourself on!
    • Dinocv
      Dinocv over 10 years
      @JimDagg Yes thank you, good read.
    • Andrew
      Andrew over 10 years
      @KyleMHB Please don't answer your question by editing it. If you have found a solution, post it as an answer to your own question.
    • Dinocv
      Dinocv over 10 years
      Ok good to know I will do, thank you.
  • Dinocv
    Dinocv over 10 years
    Ah yes! Thank you so much. Cant believe I couldn't figure that out!
  • arshajii
    arshajii over 10 years
    @KyleMHB No problem, don't forget to accept an answer.
  • Dinocv
    Dinocv over 10 years
    Done! Used the indexOf() function and its much cleaner.
  • JeffThompson
    JeffThompson about 8 years
    Upvoted for using indexOf() which is way more flexible for other uses.
  • Ben Aubin
    Ben Aubin almost 7 years
    Please explain your answer, don’t just provide a block of code (what did you change, why, how does it work).
  • Silviu Burcea
    Silviu Burcea over 3 years
    I do understand how bits work but I don't know how you ended up with 2130466 mask. Do the vowels have anything in particular, bitwise?