2013-10-03 10 views
10

Ce code Java me donne du mal:Comment vérifier si un caractère est une voyelle?

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

Je veux vérifier si la troisième lettre de mot est un non-voyelle, et si elle est que je veux revenir à la non-voyelles et les caractères précédents il. Si c'est une voyelle, elle vérifie la lettre suivante dans la chaîne, si c'est aussi une voyelle puis elle vérifie la suivante jusqu'à ce qu'elle trouve une voyelle non-voyelle.

Exemple:

mot = Jaemeas alors wordt doit = ​​Jaem

Exemple 2:

mot = Jaeoimus alors wordt doit = ​​Jaeoim

Le problème est avec mon if stateme NT, je ne peux pas comprendre comment faire vérifier toutes les voyelles dans cette ligne.

+4

'z = 'a! '|| z! =' e '...' échouera toujours. 'z' ne peut pas être égal à' a' et 'e' (et ainsi de suite) en même temps. Essayez '&&' à la place. –

+0

Je voulais que le if vérifie que ce n'était pas un 'e' 'e' 'o' 'o' 'u', comment puis-je structurer cette instruction if? – KyleMHB

+0

C'est celui-ci. Mais vous avez vu ET. –

Répondre

23

Votre état est défectueux. Pensez à la version plus simple

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

Si z est 'a' alors la seconde mi-temps sera vrai puisque z n'est pas 'e' (la toute condition est vraie), et si z est 'e' alors la première mi-temps sera vrai que z n'est pas 'a' (encore une fois, condition entière vraie). Bien sûr, si z n'est ni 'a' ni 'e' alors les deux parties seront vraies. En d'autres termes, votre condition ne sera jamais fausse!

Vous voulez probablement && s il lieu:

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

Ou peut-être:

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

Ah oui! Merci beaucoup. Je ne peux pas croire que je ne pouvais pas comprendre ça! – KyleMHB

+0

@KyleMHB Pas de problème, n'oubliez pas de [accepter une réponse] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235). – arshajii

+0

Fait! Utilisé la fonction indexOf() et son beaucoup plus propre. – KyleMHB

1

Pour commencer, vous vérifiez si la lettre est "pas" ou "pas e" ou " pas i "etc.

Disons que la lettre est i. Ensuite, la lettre n'est pas un, de sorte que renvoie "True". Alors la déclaration entière est vraie parce que i! = A. Je pense que ce que vous cherchez est de ET les déclarations ensemble, pas OU elles. Une fois que vous faites cela, vous devez regarder comment incrémenter y et vérifier à nouveau. Si la première fois que vous obtenez une voyelle, vous voulez voir si le caractère suivant est une voyelle aussi, ou non. Cela vérifie seulement le caractère à l'emplacement y = 3.

35

méthode propre pour vérifier les voyelles:

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

En fait, il existe des moyens beaucoup plus efficaces pour vérifier mais puisque vous avez demandé quel est le problème avec le vôtre, je peux dire que le problème est que vous avez pour changer les opérateurs OR avec les opérateurs AND. Avec votre instruction if, ce sera toujours vrai.

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

Voici ma réponse.

+0

Veuillez expliquer votre réponse, ne fournissez pas seulement un bloc de code (qu'avez-vous changé, pourquoi, comment ça marche). –

3

Que diriez-vous d'une approche utilisant des expressions régulières? Si vous utilisez le modèle approprié, vous pouvez obtenir les résultats de l'objet Matcher en utilisant des groupes. Dans l'exemple de code ci-dessous, l'appel à m.group (1) devrait vous renvoyer la chaîne que vous recherchez tant qu'il y a correspondance.

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

Juste une approche légèrement différente qui accomplit le même objectif.

0

J'ai déclaré une constante char [] pour les VOWELS, puis implémenté une méthode qui vérifie si un caractère est une voyelle ou non (renvoyant une valeur booléenne). Dans ma principale méthode, je déclare une chaîne et la convertir en un tableau de caractères, afin que je puisse passer l'index du tableau de caractères comme paramètre de ma méthode de 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; 
     } 
    } 
Questions connexes