it-roy-ru.com

Как проверить, является ли символ гласным?

Этот код 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, я не могу понять, как заставить его проверять все гласные в одной строке.

11
KyleMHB

Ваше состояние испорчено. Подумайте о более простой версии

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

Если z равен 'a', то вторая половина будет истинной, поскольку z не является 'e' (т.е. все условие истинно), а если z равен 'e', то первая половина будет истинной, поскольку z не является 'a' (опять же, все условие истинно). Конечно, если z не является ни 'a', ни 'e', то обе части будут верны. Другими словами, ваше состояние никогда не будет ложным!

Вы, вероятно, хотите вместо этого &&s:

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

Или возможно:

"aeiou".indexOf(z) < 0
26
arshajii

Чистый метод проверки на гласные:

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

Как насчет подхода с использованием регулярных выражений? Если вы используете правильный шаблон, вы можете получить результаты из объекта 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
jmtrachy

Для начала вы проверяете, является ли буква "не a" OR "не e" OR "not i" и т.д.

Скажем, письмо это я. Тогда буква не является, так что возвращает «Истина». Тогда все утверждение верно, потому что я! = А. Я думаю, что вы ищете, чтобы и заявления вместе, а не OR их.

Как только вы это сделаете, вам нужно посмотреть, как увеличить y и проверить это снова. Если в первый раз вы получаете гласный звук, вы хотите посмотреть, является ли следующий символ тоже гласным или нет. Это проверяет только символ в месте у = 3.

1
Drifter64

На самом деле есть гораздо более эффективные способы проверить это, но так как вы спросили, в чем проблема с вашим, я могу сказать, что проблема в том, что вы должны поменять эти операторы OR с операторами AND. С вашим утверждением if это всегда будет правдой.

1
Mehmet Sedat Güngör

Я объявил константу 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;
        }
    }
0
paranza
 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);

вот мой ответ. 

0
user2838970

Таким образом, в случае, если кто-нибудь когда-либо сталкивался с этим и хотел бы легкий метод сравнения, который может использоваться во многих сценариях. 

Не имеет значения, является ли он верхним или нижним регистром. А-Я и А-Я.

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».

0
Jeremy Trifilo