Autor Tema: Método Java código que pida una cadena y sume y devuelva los números del texto  (Leído 2362 veces)

miguelmaxs

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Hola a todos, necesito hacer un metodo java que no reciba ningún parámetro pero que me pida una cadena y me sume los números. Un ejemplo: si yo escribo "estaban 12 niñas a las 8 pm en la calle 123" el metodo debe devolverme la suma de los numeros de esa cadena, o sea 143. Lo intento hacer pero solo logro hacerlo que funcione número por número, no el conjunto y me estoy confundiendo mucho (estoy empezando en java). Gracias.
« Última modificación: 05 de Enero 2022, 21:44 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: HOLA TODOS AYUDA URGENTE JAVA
« Respuesta #1 en: 13 de Abril 2021, 12:11 »
Hola.
Una forma sería recorrer la cadena String en busca de caracteres numéricos.
Al encontrar uno, lo podemos concatenar en otro String a parte y seguir buscando.
Si el siguiente carácter también es numérico, lo concatenamos en dicho String.

Cuando se encuentre un carácter que NO es numérico, lo que hacemos es comprobar si en el String donde hemos ido concatenado números, hay algo.
Si NO esta vacío, es que ya hemos concatenado una serie de números que componen una cifra. Así que este es el momento de convertir esa "subcadena" a tipo numérico y acumular la suma.
Y volvemos a dejar la subcadena vacía, para que el método siga buscando y cuando encuentre nuevos caracteres numéricos, repita el proceso de concatenarlos.

Bien, he escrito este método y funciona CASI bien.
Código: [Seleccionar]
private static void sumaNumerosCadena() {

Scanner teclado = new Scanner(System.in);
System.out.print("Cadena: ");
String cadena = teclado.nextLine();
teclado.close();

int suma = 0; //Aquí sumaremos los números encontrados
String subCadena = "";//Aquí concatenaremos los caracteres que representen cifras de números

for (int i = 0; i < cadena.length(); i++) {
//Buscamos caracteres que representen cifras
switch(cadena.charAt(i)) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
//Se ha encontrado una caracter numérico
subCadena = subCadena + cadena.charAt(i);//Concatenamos en la subCadena
break;
default:
/*
* El carácter no es numérico. Sin embargo, es posible que en
* la "subCadena" ya tengamos algunos numéros encontrados previamente.
* Hay que comprobarlo y en caso de tener algo, convertirlo a tipo numérico
* para poder acumular la suma
*/
if (!subCadena.isEmpty()) {//No está vacía, hay números, los computamos
System.out.println("Valor numérico detectado: " + subCadena);
//Parseamos la cadena a tipo entero
int valorNum = Integer.parseInt(subCadena);
//Acumulamos suma
suma += valorNum;
//Vacíamos la subCadena para cuando se vuelva a encontrar números en la cadena
subCadena = "";
}
}//fin del switch
}//fin del bucle for

System.out.println("\nLa suma de los números encontrados es: " + suma);
}

Al probarlo, me doy cuenta de que si al final de la cadena hay una cifra, no la recoge.
Citar
Cadena: estaban 12 niñas a las 8 pm en la calle 123
Valor numérico detectado: 12
Valor numérico detectado: 8

La suma de los números encontrados es: 20

¿Por qué ocurre esto?
Porque resulta que yo solo compruebo la subcadena cuando encuentro un carácter que No es número.
¿Y qué pasa si las últimos caracteres son TODOS numéricos?
Pues que cuando el bucle termina porque ya no quedan caracteres por comprobar, resulta que tengo esa última cifra concatenada en la subcadena, pero el programa termina sin que nadie se preocupe de convertirla a número y hacer la suma.

Entonces, para solucionarlo, después del switch, hay que hacer una comprobación extra.
Hay que preguntar si estamos ya en el último carácter, y si además la cadena NO está vacía.
Código: [Seleccionar]
if (i == (cadena.length()-1) && !subCadena.isEmpty())En cuyo caso, convertimos lo que haya a entero, y sumamos.

El método corregido queda así:
Código: [Seleccionar]
private static void sumaNumerosCadena() {

Scanner teclado = new Scanner(System.in);
System.out.print("Cadena: ");
String cadena = teclado.nextLine();
teclado.close();

int suma = 0; //Aquí sumaremos los números encontrados
String subCadena = "";//Aquí concatenaremos los caracteres que representen cifras de números

for (int i = 0; i < cadena.length(); i++) {
//Buscamos caracteres que representen cifras
switch(cadena.charAt(i)) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
//Se ha encontrado una caracter numérico
subCadena = subCadena + cadena.charAt(i);//Concatenamos en la subCadena
break;
default:
/*
* El carácter no es numérico. Sin embargo, es posible que en
* la "subCadena" ya tengamos algunos numéros encontrados previamente.
* Hay que comprobarlo y en caso de tener algo, convertirlo a tipo numérico
* para poder acumular la suma
*/
if (!subCadena.isEmpty()) {//No está vacía, hay números, los computamos
System.out.println("Valor numérico detectado: " + subCadena);
//Parseamos la cadena a tipo entero
int valorNum = Integer.parseInt(subCadena);
//Acumulamos suma
suma += valorNum;
//Vacíamos la subCadena para cuando se vuelva a encontrar números en la cadena
subCadena = "";
}
}//fin del switch

/*
* Cuando estamos ya en el último carácter de la cadena,
* conviene revisar si hay algo concatenado en la "subCadena".
* Ya que como no quedan caracteres por comprobar, el bucle
* va a terminar y puede quedarse algo concatenado pendiente
* de ser convertido a valor numérico
*/
if (i == (cadena.length()-1) && !subCadena.isEmpty()) {
System.out.println("Valor numérico detectado: " + subCadena);
int valorNum = Integer.parseInt(subCadena);
suma += valorNum;
}
}//fin del bucle for

System.out.println("\nLa suma de los números encontrados es: " + suma);
}

Y ahora en pantalla podemos ver que ya sí funciona correctamente y detecta todas las cifras, incluso la que está al final de la cadena:
Citar
Cadena: estaban 12 niñas a las 8 pm en la calle 123
Valor numérico detectado: 12
Valor numérico detectado: 8
Valor numérico detectado: 123

La suma de los números encontrados es: 143
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

miguelmaxs

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re: HOLA TODOS AYUDA URGENTE JAVA
« Respuesta #2 en: 14 de Abril 2021, 13:04 »
Muchas gracias, funciona perfecto, yo lo hice asi, ¿tú que opinas?

Código: [Seleccionar]
public int sumaNumeros() {
char numeros[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
Scanner teclado = new Scanner(System.in);
int suma = 0;
String almacena = "0";
boolean igual = false;
System.out.println("ingrese una cadena y sumo los numeros");
String cadena = teclado.nextLine();
teclado.close();
for (int i = 0; i < cadena.length(); i++) {
igual = false;
for (int j = 0; j < numeros.length; j++) {

if (cadena.charAt(i) == numeros[j]) {
almacena = almacena + cadena.charAt(i) + "";
igual = true;}

}
if (igual == false) {
suma = suma + Integer.parseInt(almacena);
almacena = "0";
}

}

suma = suma + Integer.parseInt(almacena);
return suma;
}
« Última modificación: 05 de Enero 2022, 21:41 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: HOLA TODOS AYUDA URGENTE JAVA
« Respuesta #3 en: 14 de Abril 2021, 23:55 »
Es otra posible solución.
Aunque no la he probado, pero creo que te pasará como me ocurría a mi al principio, no computará un valor numérico si se encuentra justo al final de la cadena
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".