Autor Tema: Comparar cadenas String que incluyen espacios en Java error al comparar  (Leído 3659 veces)

skatersezo

  • Sin experiencia
  • *
  • Mensajes: 13
    • Ver Perfil
Estoy haciendo pruebas con una aplicación y parece ser que me da error al comparar cadenas string que incluyen espacios. Se trata de una aplicación que opera con los atributos de dos objetos.


Código principal:

Código: [Seleccionar]
package contadorcalorias;

import java.util.Scanner;

public class Pruebas {

static double peso_usuario;
static Scanner entradaTeclado = new Scanner(System.in);
static Alimento[] misAlimentos = new Alimento[9];
static Usuario user1 = new Usuario("pedro", 2700.0, 130.0, 90.0, 200.0);

public static void main(String[] args) {
// TODO Auto-generated method stub


restaAlimentosDeObjetivo();


System.out.println(user1.toString());


}

private static void restaAlimentosDeObjetivo() {

iniciaAlimentos(misAlimentos);
boolean alimentoCorrecto=false;
String alimentoIntroducido;
Alimento alimentoEscogido = null;
double gramos;



System.out.print("\nEscribe el nombre del alimento que deseas introducir: ");
alimentoIntroducido = entradaTeclado.next();

for (int i=0; i<misAlimentos.length; i++){ //bucle para comprobar si el alimento que busca el usuario existe

if (alimentoIntroducido.equalsIgnoreCase(misAlimentos[i].getNombre())){
alimentoEscogido = misAlimentos[i];
alimentoCorrecto=true;
}
}
if (alimentoCorrecto ==false){
System.out.println("No se encuentra el alimento introducido, consulta la lista de nuevo.");
} else {
if (alimentoEscogido.getNombre().equalsIgnoreCase(misAlimentos[7].getNombre())){
System.out.println("\n¿Cuantos gramos (cada huevo entero talla M pesa 60gr)?");
gramos = entradaTeclado.nextDouble();

user1.setGETobjetivo(RedondearDosDecimales(user1.getGETobjetivo() - ((gramos*alimentoEscogido.getCAL()/100))));
user1.setPROTobjetivo(RedondearDosDecimales(user1.getPROTobjetivo() - ((gramos*alimentoEscogido.getPROT()/100))));
user1.setGRASobjetivo(RedondearDosDecimales(user1.getGRASobjetivo() - ((gramos*alimentoEscogido.getGRAS()/100))));
user1.setCHobjetivo(RedondearDosDecimales(user1.getCHobjetivo() - ((gramos*alimentoEscogido.getCH()/100))));
} else {

System.out.println("\n¿Cuantos gramos?");
gramos = entradaTeclado.nextDouble();

user1.setGETobjetivo(user1.getGETobjetivo() - ((gramos*alimentoEscogido.getCAL()/100)));
user1.setPROTobjetivo(user1.getPROTobjetivo() - ((gramos*alimentoEscogido.getPROT()/100)));
user1.setGRASobjetivo(user1.getGRASobjetivo() - ((gramos*alimentoEscogido.getGRAS()/100)));
user1.setCHobjetivo(user1.getCHobjetivo() - ((gramos*alimentoEscogido.getCH()/100)));
}
}

}

/*Método para iniciar mi array de alimentos*/

public static void iniciaAlimentos(Alimento[] misAlimentos){

misAlimentos[0] = new Alimento("VERDURA", 30.0, 3.0, 0.4, 5.1);
misAlimentos[1] = new Alimento("FRUTA", 60.0, 0.3, 0.2, 13.8);
misAlimentos[2] = new Alimento("CARNE ROJA", 150.0, 24.0, 3.9, 0.0);
misAlimentos[3] = new Alimento("CARNE BLANCA", 160.0, 30.7, 3.5, 0.0);
misAlimentos[4] = new Alimento("LEGUMBRES", 378.0, 20.0, 6.0, 63.0);
misAlimentos[5] = new Alimento("CEREALES", 360.0, 6.0, 0, 86);
misAlimentos[6] = new Alimento("FRUTOS SECOS", 578, 21.3, 50.6, 19.7);
misAlimentos[7] = new Alimento("HUEVOS", 60, 6.3, 5.3, 0.6);
misAlimentos[8] = new Alimento("LECHE ENTERA", 63, 3, 3.6, 4.6);

}

/*Método para redondear decimales*/

public static double RedondearDosDecimales(double numero)
{
       return Math.rint(numero*100)/100;
}


}


Clase usuario

Código: [Seleccionar]
package contadorcalorias;

public class Usuario {

private String nombre;
private double GETobjetivo;
private double PROTobjetivo;
private double GRASobjetivo;
private double CHobjetivo;

public Usuario() {

}

public Usuario(String nombre, double GETobjetivo, double PROTobjetivo, double GRASobjetivo, double CHobjetivo){

this.nombre = nombre;
this.GETobjetivo = GETobjetivo;
this.PROTobjetivo = PROTobjetivo;
this.GRASobjetivo = GRASobjetivo;
this.CHobjetivo = CHobjetivo;

}


public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public double getGETobjetivo() {
return GETobjetivo;
}

public void setGETobjetivo (double GETobjetivo) {
this.GETobjetivo = GETobjetivo;
}

public double getPROTobjetivo() {
return PROTobjetivo;
}

public void setPROTobjetivo(double PROTobjetivo) {
this.PROTobjetivo = PROTobjetivo;
}

public double getGRASobjetivo() {
return GRASobjetivo;
}

public void setGRASobjetivo(double GRASobjetivo) {
this.GRASobjetivo = GRASobjetivo;
}

public double getCHobjetivo() {
return CHobjetivo;
}

public void setCHobjetivo(double CHobjetivo) {
this.CHobjetivo = CHobjetivo;
}


public String toString(){

return "\n" + getNombre() + " este es tu progreso diário: \n" + getGETobjetivo() + " calorías restantes. \n" + getPROTobjetivo() + " gr de proteína restantes."
+ "\n" + getGRASobjetivo() + " gr de grasa restantes. \n" + getCHobjetivo() + " gr de carbohidratos restantes.";
}




}



Clase Alimento

Código: [Seleccionar]
package contadorcalorias;

public class Alimento {

private String nombre;
private double CAL;
private double PROT;
private double GRAS;
private double CH;

//CONSTRUCTOR PARA EL OBJETO ALIMENTO

public Alimento (String nombre, double calorias, double proteina, double grasas, double ch){
this.nombre=nombre;
this.CAL=calorias;
this.PROT=proteina;
this.GRAS=grasas;
this.CH=ch;
}

//Utilizamos solo metodos getters ya que no interesa modificar los parametros en principio

public String getNombre() {
return nombre;
}

public double getCAL() {
return CAL;
}

public double getPROT() {
return PROT;
}

public double getGRAS() {
return GRAS;
}

public double getCH() {
return CH;
}

public String toString(){
return "\n" + getNombre() + ", por 100gr:" + "\n-Calorias: " + getCAL() + " cal" + "\n-Proteina: " + getPROT() + " gr" +
"\n-Grasas:" + getGRAS() + " gr" + "\n-Carbohidratos: " + getCH() + " gr ";
}

}

Si veis el fallo explicarme el por qué por favor
« Última modificación: 09 de Diciembre 2016, 20:11 por Ogramar »

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:Comparar cadenas String que incluyen espacios en Java
« Respuesta #1 en: 08 de Diciembre 2016, 19:00 »
Hola skaterezo.

El problema está en esta línea de la clase Pruebas:

Código: [Seleccionar]
alimentoIntroducido = entradaTeclado.next();
Deberías usar:

Código: [Seleccionar]
alimentoIntroducido = entradaTeclado.nextLine();
Saludos. ;D

skatersezo

  • Sin experiencia
  • *
  • Mensajes: 13
    • Ver Perfil
Re:Comparar cadenas String que incluyen espacios en Java
« Respuesta #2 en: 08 de Diciembre 2016, 19:12 »
Mil gracias pedro! Sé que nextLine introduce un salto de linea además de recoger un string, pero no entiendo bien la diferencia entre next y nextLine y cuando es más apropiado usar uno u otro...
« Última modificación: 09 de Diciembre 2016, 20:10 por Ogramar »

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Re:Comparar cadenas String que incluyen espacios en Java
« Respuesta #3 en: 08 de Diciembre 2016, 19:33 »
Según el api de java:

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#next()

Aunque mi inglés no es muy bueno, entiendo que coge todo lo que halla hasta encontrar un delimitador, que en este caso debe de ser un espacio o el final de la cadena.

Saludos.
« Última modificación: 08 de Diciembre 2016, 19:37 por pedro,, »

 

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".