2010-10-13 20 views
5

if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') { count ++;comprobación de caracteres

Cuando doy la declaración anterior, devuelve el número de vocales en una palabra solo si la palabra dada está en minúsculas (es decir: input: friend output 2 vocales). Quiero saber, incluso si doy mayúsculas o mixto, debería devolver el número de vocales. ¿Cómo hacerlo?

+0

+1 para su pregunta inspiró tantas respuestas diferentes. – DerMike

+0

ya gracias a mike – Sumithra

Respuesta

1

Puede utilizar pruebas como:

Character.toLowerCase(c) == 'a' 

en su lugar.

+0

ya lo tengo ¡Gracias! – Sumithra

+3

@Sumithra: tenga en cuenta que esto fallará en una configuración regional turca, porque tiene punteado y sin puntos i en mayúsculas y minúsculas, por lo que Character.toLowerCase ('I') == 'ı' y Character.toUpperCase ('i') == 'İ' http://en.wikipedia.org/wiki/Dotted_and_dotless_I –

+0

¿Cómo es eso un fracaso? –

3

Si desea obtener mayúscula o minúscula un enfoque simple parece ser la siguiente:

iterar sobre todos los caracteres de la palabra y hacer la siguiente prueba:

if (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' 
|| c=='A' || c=='E' || c=='I' || c=='O' || c=='U') 
    { count++ }; 
+5

+1 por usar el "principio de cambio conceptual mínimo".Esto a menudo se pasa por alto en las prisas por refactorizar, pero hay situaciones (como solucionar los problemas de producción para una) en las que es vital, para garantizar que no presente otros problemas. No hay nada tan mal visto como la introducción de un nuevo error en una solución de producción :-) – paxdiablo

+0

+1 al comentario sobre "principio de cambio conceptual mínimo" ... nunca lo conocimos como concepto aunque lo usemos con frecuencia. – Jayan

6

Here hay un ejemplo completo: tenga en cuenta que convierten la cuerda en minúsculas antes de comprobar las vocales.

También puede probar con una expresión regular, insensible, ejemplo de http://www.shiffman.net/teaching/a2z/regex/:

String regex = "[aeiou]";    
Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); 
int vowelcount = 0; 
Matcher m = p.matcher(content);   // Create Matcher 
while (m.find()) { 
    //System.out.print(m.group()); 
    vowelcount++; 
} 
+0

Otra ventaja para la expresión regular es que puede extraerse fácilmente en un método separado y puede reutilizarse para otros patrones. – Ruben

+1

+1 La solución más elegante imho –

+0

Hmmm como todos saben, regexp es la solución * más rápida *. Quiero decir, en cuanto al desarrollo ... –

1

te digo una cosa, si nos proporciona la hacia fuera puesto en mayúsculas y luego en el código aceptan da hacia fuera puesto en minúscula.

si la cadena str = 'amigo'

str.tolower mango(); Por favor, inténtelo Creo que su problema se resolvió.

9

Una forma sucinta, sencilla de hacer esto sin hacer comparaciones: 10

if ("aeiouAEIOU".indexOf(c) != -1) { count++; } 
1

No es la solución más eficiente, pero quizás el más corto? :)

int vowelCount = (inputString+" ").split("(?i)[aoeuiy]").length - 1 

Btw, ¿soy yo el único que cuenta 'y' como un wovel? ;)

1

¿Qué tal:

if (Arrays.asList('a', 'e', 'i', 'o', 'u').contains(Character.toLowerCase(c))) { 
    ... 
} 

lo haría también static final de la lista también.

+1

Esa lista debe incluirse dentro de 'Collections.unmodifiableList (..)' cuando se declare como estática final. – whiskeysierra

1

Aquí es una clase de utilidad muy simple:

public class Main { 
    public static int countChars(String string, Character... characters) { 
     return countChars(string, new HashSet<Character>(Arrays.asList(characters))); 
    } 

    public static int countChars(String string, Set<Character> characters) { 
     int count = 0; 
     for(int i = 0; i < string.length(); i++){ 
      if(characters.contains(string.charAt(i))){ 
       count++; 
      } 
     } 
     return count; 
    } 

    public static int countCharsIgnoreCase(String string, Character... characters) { 
     return countCharsIgnoreCase(string, new HashSet<Character>(Arrays.asList(characters))); 
    } 

    public static int countCharsIgnoreCase(String string, Set<Character> characters) { 
     Set<Character> finalCharacters = new HashSet<Character>(); 
     for (Character character : characters) { 
      finalCharacters.add(Character.toUpperCase(character)); 
      finalCharacters.add(Character.toLowerCase(character)); 
     } 

     return countChars(string, finalCharacters); 
    } 
} 

code on ideone

1

El uso de guayaba CharMatcher:

private final CharMatcher vowels = CharMatcher.anyOf("aeiouAEIOU"); 

... 

// somewhere in your method: 
if (vowels.matches(c)) { 
    ... 
} 
1

no vio Set aún :-(

static Character charvowels[] = { 'A','I','U','E','O','a','i','u','e','o' }; 
    static Set<Character> vowels = new HashSet<Character>(Arrays.asList(charvowels)); 
    ... 
    public void countVowel(char c) { 
    if (vowels.contains(c)) count++; 
    }