2013-10-03 19 views
10

Diese Java-Code gibt mir Mühe:Wie überprüfe ich, ob ein Char ein Vokal ist?

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 überprüfen, ob der dritte Buchstabe des Wortes ein nicht-Vokal ist, und wenn es ich will, ist es das nicht-Vokal und alle Zeichen zurückzukehren vorhergehenden es. Wenn es ein Vokal ist, prüft es den nächsten Buchstaben in der Zeichenfolge, wenn es auch ein Vokal ist, dann prüft es den nächsten, bis es einen Nicht-Vokal findet.

Beispiel:

word = Jaemeas dann wordt muss = Jaem

Beispiel 2:

word = Jaeoimus dann wordt muss = Jaeoim

The Problem ist mit meinem if Stateme Ich kann mir nicht vorstellen, wie man alle Vokale in dieser Zeile überprüfen kann.

+4

'z = 'a! '|| z! =' e '... 'wird immer versagen. 'z' kann nicht gleich 'a' und' e' (und so weiter) gleichzeitig sein. Probieren Sie stattdessen '&&'. –

+0

Ich wollte das If überprüfen, dass es nicht 'a' 'ich' 'o' 'war, wie strukturiere ich diese if-Anweisung? – KyleMHB

+0

Es ist dieser. Aber du hast UND gesehen. –

Antwort

23

Ihr Zustand ist fehlerhaft. Denken Sie an die einfachere Version

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

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

Sie wollen wahrscheinlich && s dort statt:

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

Oder vielleicht:

"aeiou".indexOf(z) < 0 
+0

Ah ja! Ich danke dir sehr. Kann nicht glauben, dass ich das nicht herausfinden konnte! – KyleMHB

+0

@KyleMHB Kein Problem, vergiss nicht [akzeptiere eine Antwort] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235). – arshajii

+0

Fertig! Benutzte die indexOf() - Funktion und ihre viel sauberer. – KyleMHB

1

Für den Anfang sind die Überprüfung Sie, wenn der Brief ist "kein" oder "nicht e" oder " nicht i "usw.

Lets sagen, dass der Buchstabe i ist. Dann ist der Buchstabe nicht ein, so dass "True" zurückgibt. Dann ist die gesamte Aussage wahr, weil ich! = A. Ich denke, was Sie suchen, ist zu UND die Aussagen zusammen, nicht ODER sie.

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

35

reinigen Methode für Vokale zu überprüfen:

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

Eigentlich gibt es viel effizientere Wege, es zu überprüfen, aber da Sie gefragt haben, was das Problem mit Ihnen ist, kann ich sagen, dass das Problem ist, Sie haben um diese ODER-Operatoren mit UND-Operatoren zu ändern. Mit Ihrer if-Anweisung wird es immer wahr sein.

0
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

Bitte erläutern Sie Ihre Antwort, geben Sie nicht nur einen Codeblock an (was haben Sie geändert, warum, wie funktioniert es). –

3

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

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 kleiner anderer Ansatz, der das gleiche Ziel erreicht.

0

Ich habe eine char [] -Konstante für die VOWELS deklariert und dann eine Methode implementiert, die überprüft, ob ein Zeichen ein Vokal ist oder nicht (gibt einen booleschen Wert zurück). In meiner Hauptmethode, ich erkläre ich einen String und es zu einer Reihe von Zeichen konvertieren, so dass ich den Index des char-Array 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; 
     } 
    } 
Verwandte Themen