1

Estoy atascado en un ejercicio y no me sale. Os pongo el enunciado y dónde me he quedado atascado.

El enunciado es el siguiente: "Realiza un programa que me pida una cadena (String) y me saque por consola todas las palabras que tiene dicha cadena, además de decir cuantas veces aparecen cada uno de los caracteres que tiene la cadena. Utiliza para ello los métodos subString, charAt y length".

Tengo el siguiente código:

Scanner sc = new Scanner(System.in);
        sc.useDelimiter("\n");
        System.out.println("Introduce una frase");
        String cadena = sc.next();
        int a = 0;
        int A = 0;
        int b = 0;
        int B = 0;
        int c = 0;
        int C = 0;
        int d = 0;
        int D = 0;
        int e = 0;
        int E = 0;
        int f = 0;
        int F = 0;
        int g = 0;
        int G = 0;
        int h = 0;
        int H = 0;
        int i = 0;
        int I = 0;
        int j = 0;
        int J = 0;
        int k = 0;
        int K = 0;
        int l = 0;
        int L = 0;
        int m = 0;
        int M = 0;
        int n = 0;
        int N = 0;
        int ñ = 0;
        int Ñ = 0;
        int o = 0;
        int O = 0;
        int p = 0;
        int P = 0;
        int q = 0;
        int Q = 0;
        int r = 0;
        int R = 0;
        int s = 0;
        int S = 0;
        int t = 0;
        int T = 0;
        int u = 0;
        int U = 0;
        int v = 0;
        int V = 0;
        int w = 0;
        int W = 0;
        int x = 0;
        int X = 0;
        int y = 0;
        int Y = 0;
        int z = 0;
        int Z = 0;

        for (int contador = 0; contador < cadena.length(); contador++) {
            if (cadena.charAt(i) == 'a') {
                a++;
            }
            if (cadena.charAt(i) == 'A') {
                A++;
            }
            if (cadena.charAt(i) == 'b') {
                b++;
            }
            if (cadena.charAt(i) == 'B') {
                B++;
            }
            if (cadena.charAt(i) == 'c') {
                c++;
            }
            if (cadena.charAt(i) == 'C') {
                C++;
            }
            if (cadena.charAt(i) == 'd') {
                d++;
            }
            if (cadena.charAt(i) == 'D') {
                D++;
            }
            if (cadena.charAt(i) == 'e') {
                e++;
            }
            if (cadena.charAt(i) == 'E') {
                e++;
            }
            if (cadena.charAt(i) == 'f') {
                f++;
            }
            if (cadena.charAt(i) == 'F') {
                F++;
            }
            if (cadena.charAt(i) == 'g') {
                g++;
            }
            if (cadena.charAt(i) == 'G') {
                G++;
            }
            if (cadena.charAt(i) == 'h') {
                h++;
            }
            if (cadena.charAt(i) == 'H') {
                H++;
            }
            if (cadena.charAt(i) == 'i') {
                i++;
            }
            if (cadena.charAt(i) == 'I') {
                I++;
            }
            if (cadena.charAt(i) == 'j') {
                j++;
            }
            if (cadena.charAt(i) == 'J') {
                J++;
            }
            if (cadena.charAt(i) == 'k') {
                k++;
            }
            if (cadena.charAt(i) == 'K') {
                K++;
            }
            if (cadena.charAt(i) == 'l') {
                l++;
            }
            if (cadena.charAt(i) == 'L') {
                L++;
            }
            if (cadena.charAt(i) == 'm') {
                m++;
            }
            if (cadena.charAt(i) == 'M') {
                M++;
            }
            if (cadena.charAt(i) == 'n') {
                n++;
            }
            if (cadena.charAt(i) == 'N') {
                N++;
            }
            if (cadena.charAt(i) == 'ñ') {
                ñ++;
            }
            if (cadena.charAt(i) == 'Ñ') {
                Ñ++;
            }
            if (cadena.charAt(i) == 'o') {
                o++;
            }
            if (cadena.charAt(i) == 'O') {
                O++;
            }
            if (cadena.charAt(i) == 'p') {
                p++;
            }
            if (cadena.charAt(i) == 'P') {
                P++;
            }
            if (cadena.charAt(i) == 'q') {
                q++;
            }
            if (cadena.charAt(i) == 'Q') {
                Q++;
            }
            if (cadena.charAt(i) == 'r') {
                r++;
            }
            if (cadena.charAt(i) == 'R') {
                R++;
            }
            if (cadena.charAt(i) == 's') {
                s++;
            }
            if (cadena.charAt(i) == 'S') {
                S++;
            }
            if (cadena.charAt(i) == 't') {
                t++;
            }
            if (cadena.charAt(i) == 'T') {
                T++;
            }
            if (cadena.charAt(i) == 'u') {
                u++;
            }
            if (cadena.charAt(i) == 'U') {
                U++;
            }
            if (cadena.charAt(i) == 'v') {
                v++;
            }
            if (cadena.charAt(i) == 'V') {
                V++;
            }
            if (cadena.charAt(i) == 'w') {
                w++;
            }
            if (cadena.charAt(i) == 'W') {
                W++;
            }
            if (cadena.charAt(i) == 'x') {
                x++;
            }
            if (cadena.charAt(i) == 'X') {
                X++;
            }
            if (cadena.charAt(i) == 'y') {
                y++;
            }
            if (cadena.charAt(i) == 'Y') {
                Y++;
            }
            if (cadena.charAt(i) == 'z') {
                z++;
            }
            if (cadena.charAt(i) == 'Z') {
                Z++;
            }

        }

            System.out.println("La frase tiene el siguiente número de letras");
            System.out.println("a: " + a);
            System.out.println("A: " + A);
            System.out.println("b: " + b);
            System.out.println("B: " + B);
            System.out.println("c: " + c);
            System.out.println("C: " + C);
            System.out.println("d: " + d);
            System.out.println("D: " + D);
            System.out.println("e: " + e);
            System.out.println("E: " + E);
            System.out.println("f: " + f);
            System.out.println("F: " + F);
            System.out.println("g: " + g);
            System.out.println("G: " + G);
            System.out.println("h: " + h);
            System.out.println("H: " + H);
            System.out.println("i: " + i);
            System.out.println("I: " + I);
            System.out.println("j: " + j);
            System.out.println("J: " + J);
            System.out.println("k: " + k);
            System.out.println("K: " + K);
            System.out.println("l: " + l);
            System.out.println("L: " + L);
            System.out.println("m: " + m);
            System.out.println("M: " + M);
            System.out.println("n: " + n);
            System.out.println("N: " + N);
            System.out.println("ñ: " + ñ);
            System.out.println("Ñ: " + Ñ);
            System.out.println("o: " + o);
            System.out.println("O: " + O);
            System.out.println("p: " + p);
            System.out.println("P: " + P);
            System.out.println("q: " + q);
            System.out.println("Q: " + Q);
            System.out.println("r: " + r);
            System.out.println("R: " + R);
            System.out.println("s: " + s);
            System.out.println("S: " + S);
            System.out.println("t: " + t);
            System.out.println("T: " + T);
            System.out.println("u: " + u);
            System.out.println("U: " + U);
            System.out.println("v: " + v);
            System.out.println("V: " + V);
            System.out.println("w: " + w);
            System.out.println("W: " + W);
            System.out.println("x: " + x);
            System.out.println("X: " + X);
            System.out.println("y: " + y);
            System.out.println("Y: " + Y);
            System.out.println("z: " + z);
            System.out.println("Z: " + Z);
        }

    }

No he realizado aún lo de separar las palabras, aunque para ello he puesto el "useDelimiter". Con lo que estoy atascado (y rallado, llevo varias horas dándole vueltas pero no sé en qué me equivoco) es que no sé en qué fallo, porque ejecuto este código con la siguiente frase de ejemplo "Mi ciudad es bonita" y me suma todas las letras a M en vez de sumar las letras a cada letra que corresponda (es decir, M: 1, i:3 etc.). Muchas gracias, un saludo.

Nicethunder
  • 84
  • 2
  • 3
  • 7
Sergio Gordillo
  • 441
  • 1
  • 6
  • 18
  • Buenas tardes @Sergio, según puedo ver existen dos problemas, el primero seria que usar la la variable `i` para ubicar el carácter que quieres comparar y no la variable de tu bucle que seria la variable `contador` – Nicethunder Dec 28 '18 at 20:20
  • lo segundo seria usar el operador `==` al comparar variables de tipo `string` , para ello te recomiendo usar el `String.equals()` ya que no se consideran primitivas las mismas. – Nicethunder Dec 28 '18 at 20:29
  • 1
    @nicethunder Está comparando char, no String – Pablo Lozano Dec 28 '18 at 22:05
  • hay formas... mas simples y eficientes de implementar lo que OP pide, por tanto debo preguntar, es *REQUERIDO* que utilize especificamente `charAt` y `length` para recorrer el String?, puede utilizar estructuras como Arrays (cosa que este ejemplo es exageradamente largo por carecer de uso de ello) o Collections (lo cual lo haria mas rapido y efficiente)? – Sith Nazgûl Cat Dec 28 '18 at 22:21
  • Sin ofender, pero este código es de lo peores que he visto en los últimos meses. Si tu profesor te obliga a no usar arrays o collections tiene mala pinta. – Xam Dec 28 '18 at 22:33
  • Los arrays aún no los hemos visto. Sé hacerlos porque he aprendido por mi cuenta pero en este caso no sabía cómo implementarlo y los métodos que pide sí, hay que meterlos sí o sí (los pide el ejercicio de forma explícita). Cualquier sugerencia acerca de como mejorar este código es bienvenida. Muchas gracias :) – Sergio Gordillo Dec 28 '18 at 22:44

3 Answers3

1

este ejercicio se puede hacer de muchas formas... por ejemplo se puede utilizar un Switch (el cual es mejor opcion que un monton de if's, incluso muchos IDE's detectan esto y lo suguieren remplazar If's por switch) para verificar la letra(numeros,letras,Enums, y desde java 7 Strings):

asumiendo la existencia de un array int contadores[] que contiene tantos espacios como Letras se necesiten contar:

switch (letra) {
        case 'a':  contadores[<index de a>]= contadores[<index de a>]++ ;
                 break;
        case 'A': contadores[<index de A>]= contadores[<index de A>]++ ;
                 break;
        case 'b':  contadores[<index de b>]= contadores[<index de b>]++ ;
                 break;
        //..... etc. 
}

otra opciones que simplifica el codigo es mediante el uso de una collection en particular de la familia de java.util.map, HashMap:

//tamanio inicial 27 caracteres x 2 (mayus+minus) 
HashMap<Character, Integer> Contador = new HashMap<>(27 * 2);
String cadena = sc.nextLine();
if (cadena != null && !cadena.trim().isEmpty()) {
    for (char current : cadena.toCharArray()) {
        if (Character.isLetter(current) && ((current >= 'a' && current <= 'z') || (current >= 'A' && current <= 'Z'))) {
            //agrega o actualiza el valor en el Map si el valor no existe use 0
            Contador.put(current, Contador.getOrDefault(current, 0) + 1);
        }
    }
} else {
    System.out.println("No hay informacion!");
}
System.out.println("La frase tiene el siguiente número de letras");
Contador.forEach( (key, value)->{System.out.println(String.format("La letra '%s' aparece %d veses en el texto",key,value));});

y de esta forma no hay que poner 54 case statements o 54 if's, por tanto lee el Tutorial de Java de como utilizar Collections y de igual forma como utilizar Arrays. Con respecto a la parte de contar/separar palabras de la oracion por favor hacer referencia a esta pregunta: Cómo separar un String en Java. Cómo utilizar split()

Sith Nazgûl Cat
  • 717
  • 5
  • 11
0

Cada palabra no tiene el mismo tamaño verdad?. Entonces primero ponemos el objeto abecedario todas las letras juntas, que son 28 o 27 depende del idioma, el for dice: des de la posición 0 empieza a recoorrer la cantdad de letras que tenga esa palabra es decir el (.lenght) y esto siempre se ajustara al tamaño que la palabra quieras poner, es decir si dices "casa", son 4 y recorrera 4 veces si es perro sera 5 pero el .lenght se adaptará al tamaño de la palabra. Por lo tanto cuando imprimes el for sale todo el proceso que recuure la palabra. Y esto sirve tanto Strings, numeros o letras. En el impreso puedes poner la i

he abierto el eclipse y ahi lo tienes bien escrito, siento no haber abierto antes el eclipse:

String  abedecedario ="abcdefghijklmnopqrstuvwxyz";

    int i=0;

    int j=0;

    for (i=0; i<abedecedario.length();i++) {
        

System.out.println("numero"+i+"imprimir letras "+abedecedario.charAt(i));

    }
-1

Monta dos bucles:

  • en el primero recorres la string
    • para cada letra que saques
      • buscas en un map para ver si ya tienes la letra
      • si no la tienes, añades la entrada al map *luego sumas uno, si la tienes, solo sumas
  • Si durante este bucle te anotas la posición que ocupas la primera vez
  • y luego, cuando encuentres un espacio, puedes utilizar substring para obtener la palabra e imprimirla
Ruslan López
  • 10,060
  • 11
  • 35
  • 68
migarcia
  • 21
  • 7
  • Hola @migarcia, aunque esta publicación pudiera servir para solucionar el problema expuesto en la pregunta, ha sido reportada como de baja calidad debido a su extensión y contenido. Deberías editar la respuesta para añadir algo más de detalle (p.e. ¿cómo se haría lo que comentas? ¿dónde iría en el código compartido en la preungta?). Lee [answer] y cómo crear un [mcve] para más información. – Alvaro Montoro Dec 28 '18 at 21:31
  • Gracias. Lo tendre en cuenta. – migarcia Dec 30 '18 at 07:08