Как проверить, является ли char гласной?
Этот код 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 then wordT must = Jaem
Пример 2:
word = Jaeoimus then wordT must = Jaeoim
Проблема с моим оператором if
, я не могу понять, как заставить его проверять все гласные в этой строке.
Ответы
Ответ 1
Ваше состояние ошибочно. Подумайте о более простой версии
z != 'a' || z != 'e'
Если z
- 'a'
, тогда вторая половина будет истина, так как z
не 'e'
(т.е. все условие истинно), а если z
- 'e'
, то первая половина будет истинно, так как z
не 'a'
(опять же, полное условие истинно). Конечно, если z
не является ни 'a'
, ни 'e'
, то обе части будут истинны. Другими словами, ваше состояние никогда не будет ложным!
Скорее всего, вы захотите &&
:
z != 'a' && z != 'e' && ...
Или, возможно:
"aeiou".indexOf(z) < 0
Ответ 2
Очистить метод проверки гласных:
public static boolean isVowel(char c) {
return "AEIOUaeiou".indexOf(c) != -1;
}
Ответ 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);
}
Совсем другой подход, который выполняет одну и ту же цель.
Ответ 4
Во-первых, вы проверяете, является ли буква "не" ИЛИ "не e" ИЛИ "не я" и т.д.
Давайте скажем, что буква i. Тогда буква не является, поэтому возвращает "Истина". Тогда весь оператор True, потому что я!= A. Я думаю, что то, что вы ищете, это AND и вместе, а не OR.
Как только вы это сделаете, вам нужно посмотреть, как увеличить y и проверить это снова. Если в первый раз, когда вы получаете гласную, вы хотите увидеть, является ли следующий символ гласной тоже, или нет. Это проверяет символ только в позиции y = 3.
Ответ 5
На самом деле есть гораздо более эффективные способы проверить это, но, поскольку вы задали вопрос о том, что является проблемой с вашей, я могу сказать, что проблема в том, что вам нужно изменить эти операторы OR с операторами AND. С вашим оператором if он всегда будет правдой.
Ответ 6
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);
вот мой ответ.
Ответ 7
Я объявил константу char [] для VOWELS, затем реализовал метод, который проверяет, является ли 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;
}
}
Ответ 8
Таким образом, в случае, если кто-нибудь когда-либо сталкивался с этим и хотел бы легкий метод сравнения, который может использоваться во многих сценариях.
Не имеет значения, является ли он верхним или нижним регистром. AZ и az.
bool vowel = ((1 << буква) & 2130466)! = 0;
Это самый простой способ, который я мог придумать. Я проверил это в C++ и на 64-битном ПК, поэтому результаты могут отличаться, но в основном в "32-битном целом" доступно только 32 бита, так как такие биты 64 и 32 удаляются, и у вас остается значение от 1 до 26 при выполнении "<< буквы".
Если вы не понимаете, как работают биты, извините, я не буду вдаваться в подробности, но техника
1 << N - это то же самое, что 2 ^ N степень или создание степени два.
Поэтому, когда мы делаем 1 << N & X, мы проверяем, содержит ли X степень двойки, которая создает нашу гласную, находится в этом значении 2130466. Если результат не равен 0, то это был успешно гласный.
Эта ситуация может применяться ко всему, для чего вы используете биты, и даже значения, превышающие 32, для индекса будут работать в этом случае, если диапазон значений составляет от 0 до 31. Так что, как и в упомянутых выше буквах, может быть 65-90 или 97 -122 но с тех пор, но мы продолжаем удалять 32, пока у нас не останется остаток в диапазоне 1-26. Остальное не так, как это на самом деле работает, но дает представление о процессе.
Что следует иметь в виду, если у вас нет гарантии на входящие письма, чтобы проверить, находится ли буква ниже "А" или выше "и". Поскольку результаты всегда будут ложными в любом случае.
Например, следующее вернет ложный гласный. "!" восклицательным знаком является значение 33, и оно будет предоставлять то же значение бита, что и "A" или "a".