web-dev-qa-db-ger.com

Wie überprüfe ich, ob ein Zeichen ein Vokal ist?

Dieser Java-Code macht mir Probleme:

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

Ich möchte prüfen, ob der dritte Buchstabe von Word ein Nicht-Vokal ist und ob er den Nicht-Vokal und alle vorangestellten Zeichen zurückgeben soll. Wenn es ein Vokal ist, prüft es den nächsten Buchstaben in der Zeichenfolge. Wenn es auch ein Vokal ist, prüft es den nächsten, bis er einen Nicht-Vokal findet.

Beispiel:

Word = Jaemeas, dann muss WordT = Jaem sein

Beispiel 2

Word = Jaeoimus, dann muss WordT = Jaeoim sein

Das Problem ist mit meiner if-Anweisung. Ich kann nicht herausfinden, wie ich alle Vokale in dieser einen Zeile überprüfen soll.

11
KyleMHB

Ihr Zustand ist fehlerhaft. Denken Sie an die einfachere Version

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

Wenn z'a' ist, ist die zweite Hälfte wahr, da z nicht 'e' ist (d. H. Die gesamte Bedingung ist wahr), und wenn z'e' ist, dann ist die erste Hälfte wahr, da z nicht 'a' ist (wieder ganze Bedingung wahr). Wenn z weder 'a' noch 'e' ist, sind beide Teile natürlich wahr. Mit anderen Worten, Ihr Zustand wird niemals falsch sein!

Sie möchten wahrscheinlich stattdessen &&s:

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

Oder vielleicht:

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

Saubere Methode zur Überprüfung auf Vokale:

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

Wie wäre es mit einem Ansatz, der reguläre Ausdrücke verwendet? Wenn Sie das richtige Muster verwenden, können Sie die Ergebnisse mithilfe von Gruppen vom Matcher-Objekt abrufen. In dem folgenden Codebeispiel sollte der Aufruf von m.group (1) die Zeichenfolge zurückgeben, nach der Sie suchen, solange eine Musterübereinstimmung vorliegt.

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

Nur ein etwas anderer Ansatz, der dasselbe Ziel erreicht.

3
jmtrachy

Für den Anfang prüfen Sie, ob der Buchstabe "kein" OR "ist, nicht e" OR "nicht i" usw.

Lass uns sagen, dass der Brief ich ist. Dann ist der Buchstabe nicht ein, so dass "True" zurückgegeben wird. Dann ist die gesamte Aussage wahr, weil i! = A. Ich denke, was Sie suchen, ist UND die Aussagen zusammen und nicht OR.

Wenn Sie dies getan haben, müssen Sie prüfen, wie Sie y erhöhen und dies erneut überprüfen. Wenn Sie zum ersten Mal einen Vokal erhalten, möchten Sie sehen, ob der nächste Charakter auch ein Vokal ist oder nicht. Dies prüft nur das Zeichen an Position y = 3.

1
Drifter64

Tatsächlich gibt es viel effizientere Möglichkeiten, dies zu überprüfen. Da Sie jedoch gefragt haben, welches Problem bei Ihnen vorliegt, kann ich feststellen, dass das Problem darin besteht, dass Sie die OR - Operatoren mit AND-Operatoren ändern müssen. Mit Ihrer if-Aussage wird es immer wahr sein.

Ich habe eine char [] -Konstante für VOWELS deklariert und dann eine Methode implementiert, die prüft, ob ein Char ein Vokal ist oder nicht (und einen booleschen Wert zurückgibt). In meiner Hauptmethode deklariere ich eine Zeichenfolge und konvertiere sie in ein Array von Zeichen, sodass ich den Index des Char-Arrays als Parameter meiner isVowel-Methode übergeben kann: 

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

hier ist meine Antwort. 

0
user2838970

Falls also jemand darauf stößt, möchte er eine einfache Vergleichsmethode, die in vielen Szenarien verwendet werden kann. 

Egal ob GROSSBUCHSTABEN oder Kleinbuchstaben. A-Z und a-z.

booler Vokal = ((1 << Buchstabe) & 2130466)! = 0;

Dies ist der einfachste Weg, an den ich denken könnte. Ich habe dies in C++ und auf einem 64-Bit-PC getestet. Die Ergebnisse können davon abweichen. Grundsätzlich sind jedoch nur 32 Bit in einer "32-Bit-Ganzzahl" verfügbar, da Bit 64 und Bit 32 entfernt werden und der Wert zwischen 1 und 26 erhalten bleibt der "<< Buchstabe". 

Wenn Sie nicht verstehen, wie die Teile funktionieren, tut mir leid, ich gehe nicht in die Tiefe, sondern durch die Technik 

1 << N ist dasselbe wie 2 ^ N Potenz oder die Erzeugung von Zweierpotenzen.

Wenn wir also 1 << N & X ausführen, prüfen wir, ob X die Potenz von zwei enthält, die unseren Vokal in diesem Wert 2130466 erzeugt. Wenn das Ergebnis nicht gleich 0 ist, war es erfolgreich ein Vokal. 

Diese Situation kann auf alles zutreffen, für das Sie Bits verwenden, und Werte, die größer als 32 für einen Index sind, funktionieren in diesem Fall, solange der Wertebereich zwischen 0 und 31 liegt. Daher können die oben genannten Buchstaben 65-90 oder 97 sein -122 aber da entfernen wir aber weiterhin 32, bis wir einen Rest von 1-26 übrig haben. Der Rest ist nicht so, wie er tatsächlich funktioniert, aber er gibt Ihnen eine Vorstellung von dem Prozess. 

Denken Sie daran, wenn Sie keine Garantie für die eingehenden Briefe haben, um zu überprüfen, ob der Brief unter 'A' oder über 'u' liegt. Da die Ergebnisse sowieso immer falsch sein werden. 

Zum Beispiel wird das Folgende ein falsches Vokal-Positiv zurückgeben. "!" Ausrufezeichen ist Wert 33 und es wird derselbe Bitwert bereitgestellt wie 'A' oder 'a'.

0
Jeremy Trifilo