How do I check if a char is a vowel?
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.
Related videos on Youtube
Dinocv
Updated on July 09, 2022Comments
-
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 over 10 years
z!='a'||z!='e'...
will always fail.z
can't be equal toa
ande
(and so on) at the same time. Try&&
instead. -
Dinocv over 10 yearsI wanted the if to check that it wasnt 'a' 'e' 'i' 'o' 'u', how do I structure that if statement?
-
xlecoustillier over 10 yearsIt's this one. But you seen AND.
-
AlexB over 10 yearsDon't forget
y
vowel ! And I'm a little bit confused about yourif
condition : every letter is differeent froma
ORe
etc... UseAND
operator instead -
Sid over 10 years@X.L.Ant Isn't
||
theOR
logic? I guess that statement will pass. -
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 over 10 yearsbtw: !(a && B) is (!a || !b)
-
Dinocv over 10 yearsYeah thanks guys I sorted it out, it was supposed to us an
AND
not anOR
. However if you see the answer I selected the"AEIOUaeiou".indexOf(z) <0
is a much cleaner solution -
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 over 10 years@JimDagg Yes thank you, good read.
-
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 over 10 yearsOk good to know I will do, thank you.
-
-
Dinocv over 10 yearsAh yes! Thank you so much. Cant believe I couldn't figure that out!
-
arshajii over 10 years@KyleMHB No problem, don't forget to accept an answer.
-
Dinocv over 10 yearsDone! Used the indexOf() function and its much cleaner.
-
JeffThompson about 8 yearsUpvoted for using
indexOf()
which is way more flexible for other uses. -
Ben Aubin almost 7 yearsPlease explain your answer, don’t just provide a block of code (what did you change, why, how does it work).
-
Silviu Burcea over 3 yearsI 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?