Java - Contador de vocales

 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Contador de vocales

Publicado por M (7 intervenciones) el 15/12/2018 18:55:34
Hola, me gustaría saber si alguien ve cuál es el fallo de mi programa. En él se pretende contar el número de vocales que posee un texto introducido por teclado. Cuando lo ejecuto pasan dos cosas: o solo me cuenta el número de as que hay, o directamente no carga. Muchas gracias por adelantado!!!!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static int conteo(String texto){
  int posUltVocal = 0;
    int posicionV;
    int conteoV = 0;
    boolean encontrado = true;
    int tamano = texto.length();
    char array[]= {'a', 'e' , 'i', 'o', 'u'};
 
    //Hago un conteo con cada vocal
    for(int i = 0; i < array.length; i++){
      while(posUltVocal < tamano && encontrado){
        posicionV = texto.indexOf(array[i], posUltVocal);
        if(posUltVocal != -1){
          conteoV++;
          posUltVocal = posicionV + 1;
        } else{
          encontrado = false;
          posUltVocal = 0;
        }
        encontrado = true;
      }
    }
    return conteoV;
  }
 
  public static void main(String[] args){
    String texto = "";
    Scanner sc = new Scanner(System.in);
 
    System.out.println("Introduce una frase");
    texto = sc.nextLine();
    int conteoVoc = 0;
 
    conteoVoc = conteo(texto);
 
 
    System.out.println("Aparecen " + conteoVoc + " vocales.");
  }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Contador de vocales

Publicado por Billy Joel (878 intervenciones) el 15/12/2018 19:27:11
Veo tu código y me siento muy confundido.ya que indexOf se utiliza para devolver la posición de un elemento dentro del String.
Si lo que buscas es contar la cantidad de vocales que tiene la fase te recomiendo utilizar charAt(posicion)

¿Cómo lo haría yo?
Pues así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
public static int conteo(String texto) {
    int posUltVocal = 0;
    int posicionV;
    int conteoV = 0;
    boolean encontrado = true;
    int tamano = texto.length();
    char array[] = {'a', 'e', 'i', 'o', 'u'};
    //Hago un conteo con cada vocal
    for (int i = 0; i < array.length; i++) {
        while (posUltVocal < tamano && encontrado) {
            posicionV = texto.indexOf(array[i], posUltVocal);
            if (posUltVocal != -1) {
                conteoV++;
                posUltVocal = posicionV + 1;
            } else {
                encontrado = false;
                posUltVocal = 0;
            }
            encontrado = true;
        }
    }
    return conteoV;
}
 
public static void caracteres(String texto) {
    Map<Character, Integer> m = new HashMap();
    for (int i = 0; i < texto.length(); i++) {
        m.put(texto.charAt(i), m.containsKey(texto.charAt(i)) ? m.get(texto.charAt(i)) + 1 : 1);
    }
    System.out.println("Los caracteres que tiene el texto son:");
    m.forEach((k, v) -> {
        System.out.println(k + ": " + v);
    });
}
 
public static void vocales(String texto) {
    int a = 0;
    int e = 0;
    int i = 0;
    int o = 0;
    int u = 0;
    int consonante = 0;
    for (int j = 0; j < texto.length(); j++) {
        switch (texto.charAt(j)) {
            case 'a':
                a++;
                break;
            case 'e':
                e++;
                break;
            case 'i':
                i++;
                break;
            case 'o':
                o++;
                break;
            case 'u':
                u++;
                break;
            default:
                consonante++;
                break;
        }
    }
    System.out.println("La frase cuenta con las siguientes vocales");
    if(a > 0)
        System.out.println("a: " + a);
    if(e > 0)
        System.out.println("e: " + e);
    if(i > 0)
        System.out.println("i: " + i);
    if(o > 0)
        System.out.println("o: " + o);
    if(u > 0)
        System.out.println("u: " + u);
    if(consonante > 0){
        System.out.println("La frase cuenta con " + consonante + " consonantes");
    }
}
 
public static void main(String[] args) {
    String texto = "";
    Scanner sc = new Scanner(System.in);
    System.out.println("Introduce una frase");
    texto = sc.nextLine();
//    int conteoVoc = 0;
//    conteoVoc = conteo(texto);
//    System.out.println("Aparecen " + conteoVoc + " vocales.");
    caracteres(texto);
    vocales(texto);
}

Espero haberte ayudado
Saludos!
;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Contador de vocales

Publicado por M (1 intervención) el 15/12/2018 19:42:49
Hola! Muchas gracias por la ayuda, he reeditado el código con el mismo método que me has dicho (el de charAt()) y he añadido el switch y funciona para palabras de corta longitud, pero no cuando introduces más largas (no sé si es debido a que he seguido utilizando el .length() sobre el String en vez de contar los caracteres o qué). Adjunto el código actual por si visualizas qué es lo que puede estar ocurriendo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public static int conteo(String texto){
  int posUltVocal = 0;
    int posicionV;
    int conteoV = 0;
    boolean encontrado = true;
    int tamano = texto.length();
 
    //Hago un conteo con cada vocal
    for(int i = 0; i < tamano; i++){
 
      switch(texto.charAt(i)){
        case 'a':
          conteoV++;
          break;
 
        case 'e':
          conteoV++;
 
        case 'i':
          conteoV++;
          break;
 
        case 'o':
          conteoV++;
          break;
 
        case 'u':
          conteoV++;
          break;
 
      }
    }
    return conteoV;
  }
 
  public static void main(String[] args){
    String texto = "";
    Scanner sc = new Scanner(System.in);
 
    System.out.println("Introduce una frase");
    texto = sc.nextLine();
    int conteoVoc = 0;
 
    conteoVoc = conteo(texto);
 
 
    System.out.println("Aparecen " + conteoVoc + " vocales.");
  }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Contador de vocales

Publicado por Billy Joel (878 intervenciones) el 15/12/2018 22:01:29
Viendo tu código veo que te hizo falta un break en el case 'e'

De todas formas si solo necesitas contar si el caracter es vocal entonces lo puedes hacer así:
1
2
3
4
5
6
7
8
9
10
11
12
13
public static int conteo(String texto) {
    int contador = 0;
    for (int i = 0; i < texto.length(); i++) {
        if (texto.charAt(i) == 'a'
                || texto.charAt(i) == 'e'
                || texto.charAt(i) == 'i'
                || texto.charAt(i) == 'o'
                || texto.charAt(i) == 'u') {
            contador++;
        }
    }
    return contador;
}


;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Contador de vocales

Publicado por M (7 intervenciones) el 16/12/2018 10:18:04
Después de mirar mucho el programa caí en lo del break, pero igualmente muchísimas gracias. Solo necesitaba contar el número de vocales en general, y la verdad es que con el último código queda mucho más optimizado. Muchísimas gracias!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar