Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: miguelmaxs en 13 de Abril 2021, 01:28
-
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.
-
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.
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.
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 SÍ 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.
if (i == (cadena.length()-1) && !subCadena.isEmpty())
En cuyo caso, convertimos lo que haya a entero, y sumamos.
El método corregido queda así:
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:
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
-
Muchas gracias, funciona perfecto, yo lo hice asi, ¿tú que opinas?
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;
}
-
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