Autor Tema: cómo controlar que introducimos valores de un enumerado (comparar) en Java  (Leído 7106 veces)

ZID

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Hola, soy nuevo aqui y estoy estudiando Java, aunque por ahora la verdad es que me esta costando. Estoy tratando de lograr crear un programa que controla que solo introduces valores ya fijados en un enumerado, pero no lo consigo. Os cuento lo que quiero decir mostrando el codigo.

Casa.java
Código: [Seleccionar]

public class Casa {

    String color;

    public String getColor() {
        return this.color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Casa() {
        color = "Rojo";
    }

    public Casa(String color) {
        this.color = color;
}
 
 public String toString(){
       return "La casa está pintada de color "+ this.color;
    }   
   
}


CambiarColorCasa.java
Código: [Seleccionar]
/**
 * En esta clase principal, quiero declarar un enumerado con los valores BLANCO,
 * AZUL y VERDE, que son los valores que puede admitir el atributo del color de la casa.
 * De forma que tras recoger el color por el usuario, el programa debe valerse de ese
 * enumerado para comprobar si es un color válido.
 *
 */

public class CambiarColorCasa {

    public enum Colores {BLANCO, AZUL, VERDE};
 
     
    public static void main(String[] args) {
     Casa casaPintada = null;
     Casa casaSinPintar = null;
 
    String color2;
    int eleccion;
    String respuesta;
   
   do {

            Mensajes.msgln("\t\t1.- Crear una casa sin pintar.");
            Mensajes.msgln("\t\t2.- Crear una casa pintada.");
            Mensajes.msgln("\t\t3.- Pinta la casa");
            Mensajes.msgln("\t\t4.- Muestra el color de la casa\n");

            Mensajes.msgln("\t\t0.- Salir de la aplicación.");
            Mensajes.msgln("\t=========================================================\n");

           
            eleccion = Mensajes.leeEntero("\tIntroduzca la opción elegida:", 0, 4);
           
            switch (eleccion) {
                case 0:
                    Mensajes.msgln("\tCerrando...");
                    break;
               
                case 1:
                    casaSinPintar = new Casa();
                    Mensajes.msgln("\tSe creó una casa sin pintar. \n"
                            + "\tDeberás pintarla. \n");
                    break;
                   
                case 2:
                    color2 = Mensajes.leeCadena("\tIntroduce el color: ");
                    casaPintada = new Casa(color2);
                    Mensajes.msgln("\t Se creó una casa pintada.\n");
                    break;
   
               
                case 3:       
                   
                    if (casaSinPintar != null) {
                        color2 = Mensajes.leeCadena("\tIntroduzca un nuevo color: ");
                        if (casaSinPintar.getColor().equals("Rojo")) {
                            casaSinPintar.setColor(color2);
                            Mensajes.msgln("\n\tLa casa esta pintada de nuevo ");
                        } else {
                            respuesta = Mensajes.leeCadena("\n\tEl color actual es: " + casaSinPintar.getColor()
                                    + ". ¿Desea cambiarlo? (S/N): ");
                            if (respuesta.equalsIgnoreCase("s")) {
                                casaSinPintar.setColor(color2);
                                Mensajes.msgln("\n\tEl color ahora es " + casaSinPintar.getColor() + ".\n ");
                            } else {
                                Mensajes.msgln("\n\tCambio de color cancelado.");
                            }
                        }
                    } else {
                        Mensajes.msgln("No existe la casa.");
                    }

                    break;   
                   
                case 4:           
                       
                    Mensajes.msgln("Casa sin pintar");
                    if (casaSinPintar == null)
                    Mensajes.msgln("No hay datos aún");
                    else
                    System.out.println(casaSinPintar.toString());
                   
                    Mensajes.msgln("Casa pintada");
                    if (casaPintada == null)
                    Mensajes.msgln("No hay datos aún");
                    else
                    System.out.println(casaPintada.toString());
           
                    break;
                   
                   
                default:
                break;
               
            } // Switch
        } while (eleccion
                != 0);
    }//Fin del main

   
}//Fin de la clase

Mensajes.java
Código: [Seleccionar]
import java.util.Scanner;


public class Mensajes {

     public static int leeEntero(String mensaje, int minimo, int maximo) throws IllegalArgumentException  {
        int numero = 0;
        boolean leido = false;
        Scanner teclado = null;

     
        if (minimo <= maximo) {
            do {
                Mensajes.msgln(mensaje);
                try {
                    teclado = new Scanner(System.in);
                    numero = teclado.nextInt();
                    if (numero >= minimo && numero <= maximo) {
                        leido = true;
                    } else {
                        Mensajes.msgln("Error: Debe ser un número entero mayor o igual que " + minimo + " y menor o igual que " + maximo + ". ");
                    }
                } catch (Exception e) {
                    Mensajes.msgln("Error: No es un número entero válido. ");
                }
            } while (!leido);
        } else {
            throw new IllegalArgumentException("Error");
        }
        return numero;
    }
   
    public static String leeCadena() {
        Scanner teclado = new Scanner(System.in);
        String cadena = "";
        try {
            cadena = teclado.nextLine();
        } catch (Exception e) {
            Mensajes.msgln("Error.");
        }
        return cadena;
    }


    public static String leeCadena(String mensaje) {
        Scanner teclado = new Scanner(System.in);
        String cadena = "";
        try {
            Mensajes.msgln(mensaje);
            cadena = teclado.nextLine();
        } catch (Exception e) {
            Mensajes.msgln("Error.");
        }
        return cadena;
    }


    public static void msg(String cadenaAImprimir) {
        System.out.print(cadenaAImprimir);
    }


    public static void msgln() {
        System.out.println();
    }

   
    public static void msgln(String cadenaAImprimir) {
        System.out.println(cadenaAImprimir);
    }

 
}

El problema lo tengo en CASE 3. El programa funciona pero no controlo que los valores introducidos sean los declarados en el enumerado, que es justo lo que trato de hacer pero no se como. Me he leído la parte del curso dedicada a los enumerados y no he encontrado que se usen para controlar que escribes uno de los valores declarados.
Cualquier ayuda es bienvenida, gracias!
« Última modificación: 09 de Diciembre 2014, 07:58 por Alex Rodríguez »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Duda con controlar que introducimos valores de un enumerado
« Respuesta #1 en: 08 de Diciembre 2014, 18:01 »
Hola ZID, creo que el código de la última clase que intentabas pegar ha salido cortado. Intenta ponerlo completo para poder analizarlo. Para el estudio de java recomendamos seguir este curso, donde se tratan también los tipos enumerados: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

ZID

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Duda con controlar que introducimos valores de un enumerado
« Respuesta #2 en: 08 de Diciembre 2014, 18:43 »
Gracias por el aviso!!

Ya he actualizado el codigo!

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Duda con controlar que introducimos valores de un enumerado
« Respuesta #3 en: 08 de Diciembre 2014, 19:38 »
Hola, en el código se ve algo que no parece propio de un buen diseño, al menos en cuanto a nombres. Me refiero a que la clase con el método main se llame CambiarColorCasa. Esto más bien parece el nombre de un método de la clase Casa que un nombre de una clase con el main.

Ya sobre el uso de enum, la impresión que me da con el código que has puesto es que no estás diferenciando bien lo que es un enum de lo que es un String, y un enum no es un String (aunque cada uno de los valores de un enum pueda llevar asociado un String si queremos).

Te dejo este código que viene siendo un ejemplo simple a ver si te sirve para lo que intentas hacer:


Clase donde definimos el tipo enumerado:

Código: [Seleccionar]
// Ejemplo aprenderaprogramar.com
// Clase que contiene los tipos de color que se permiten para una casa

public enum Color {
    INDEFINIDO ("indefinido"), //Separamos con comas
    ROJO ("rojo"),
    VERDE ("verde"),
    AZUL("azul");  //Cuando terminamos cerramos con ;

    //Campos tipo constante   
    private final String color; //Color permitido para una casa

    /**
     * Constructor. Al asignarle uno de los valores posibles a una variable del tipo enumerado el constructor asigna
    automáticamente valores de los campos
     */

    Color (String color) {
        this.color = color;
    } //Cierre del constructor

    //Métodos de la clase tipo Enum
    public String getColor() { return color; }
} //Cierre del enum

Clase con el método main

Código: [Seleccionar]
import java.util.Scanner;

public class testColoresCasa {
    public static void main (String[] Args)    {
        String colorComoStringElegidoUsuario = "";
        Color colorUsuario = Color.INDEFINIDO;

        Color coloresPermitidos[] = {Color.ROJO, Color.VERDE, Color.AZUL};

        System.out.println("Comenzamos");
        Scanner scan = new Scanner(System.in);

        System.out.print("Introduzca el color de la casa: ");
        colorComoStringElegidoUsuario = scan.nextLine();

        System.out.println("¿Qué nos devuelve toString para un tipo enumerado? "+Color.ROJO.toString());

        System.out.println("¿Podemos comparar un String con un enum? No ");
        // +(Color.ROJO==colorComoStringElegidoUsuario) no podemos usarlo

        if (colorComoStringElegidoUsuario.equalsIgnoreCase("rojo")) {colorUsuario = Color.ROJO;}

        if (colorUsuario == Color.ROJO) {
            System.out.println("El color elegido es válido");
        }
        else {
            System.out.println("Usted no ha elegido el rojo, ese es el único color permitido");
        }

    }
}

Revísalo a ver si te sirve y nos cuentas!!!
Responsable de departamento de producción aprenderaprogramar.com

ZID

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Duda con controlar que introducimos valores de un enumerado
« Respuesta #4 en: 08 de Diciembre 2014, 19:51 »
Muchísimas gracias, ahora lo analizo y estudio con detenimiento y cuando lo comprenda bien me pasaré de nuevo por aquí para confirmarlo.

Es cierto que los nombres aún no los domino bien, acabo de empezar y creo que ando algo confuso en cosas básicas, lo cual es un problema que tengo que solucionar antes de entrar en temas más complejos.


César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Duda con controlar que introducimos valores de un enumerado
« Respuesta #5 en: 08 de Diciembre 2014, 20:03 »
Nuestra recomendación es seguir el curso que te he indicado desde el principio, e ir posteando los ejercicios para que te los revisemos moderadores u otros compañeros que ayudan en los foros, de esa forma te aseguras de llevar todos los contenidos necesarios en el orden adecuado. Saludos!
Responsable de departamento de producción aprenderaprogramar.com

ZID

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Duda con controlar que introducimos valores de un enumerado
« Respuesta #6 en: 08 de Diciembre 2014, 20:25 »
Pues si, veo que el curso tiene muy buena pinta y creo que los ejercicios me van a venir muy bien para afianzar contenido. ¡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".