Как проверить, является ли 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".