Autor Tema: Ejercicio propuesto CU00666B foreach o for extendido java  (Leído 3818 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola, presento aquí el ejercicio de la lección CU00666B
Citar
EJERCICIO
Crea una clase denominada ListaCantantesFamosos que al ser inicializada contenga un ArrayList con
tres Strings que sean el nombre de cantantes famosos. Crea una clase test con el método main que
inicialice un objeto ListaCantantesFamosos y usando un for extendido muestre los cantantes en la lista
por pantalla. Se debe pedir al usuario un nombre más de cantante famoso, y una vez introducido
mostrar la lista actualizada usando un for extendido. Una vez mostrada la lista actualizada, se debe dar
opción a elegir entre volver a introducir otro cantante o salir del programa (se podrán introducir tantos
cantantes como se desee, para ello usa un bucle while que dé opción a elegir al usuario).
Ejercicio formado por 3 clases:
Clase TestCantantes con main
Código: [Seleccionar]
import java.lang.Iterable;
/**
 * Detalles de la clase.
 * Crea un objeto del tipo ListaCantantesFamosos y edita su contenido.
 * @author (Toni)
 * @version (0)
 */
public class TestCantantes {

    // Atributos de la clase TestCantantes

    /**
     * Constructor para objetos de la clase TestCantantes
     */
    public TestCantantes() {
        // Inicializa atributos

    } // Fin del constructor TestCantantes

    // Siguen los setters para los atributos de la clase TestCantantes

    // Ahora los getters para los atributos de la clase TestCantantes

    // Y seguidamente, procedimientos y funciones varios.
    public static void main (String [] args) {
        // listaCF nuevo objeto ListaCantantesFamosos.
        ListaCantantesFamosos listaCF = new ListaCantantesFamosos("Nombre Cantante");
        // mensaje presentará mensajes o/y pedirá entradas por teclado.
        Mensaje mensaje = new Mensaje("\tSe ha creado una lista de cantantes.\n\tCon los " + listaCF.getTamañoLista() + " elementos siguientes:");
        listaCF.presentaElementos();

        String lectura = "";              // Texto introducido por teclado
        boolean quieresContinuar = true;  // Controla la condición del while principal
        boolean presentarMenu = true;     // Controla el while anidado
        boolean seHaEliminado = false;    // Si se elimina un elemento, será true
        int elemento = -1;                // Número del elemento a eliminar
        do {                              // Bucle para editar la lista de cantantes, while principal
            lectura = mensaje.responde ("\tIntroduzca un nuevo nombre para añadir a la lista.",1);
            listaCF.addNombreNuevo(lectura);   // Añade a la lista
            mensaje.muestra ("La lista con " + listaCF.getTamañoLista() + " elementos, queda como sigue:");
            listaCF.presentaElementos();

            presentarMenu = true;              // Controla el siguiente while anidado
            while (presentarMenu) {            // Este es el menú de opciones
                lectura = mensaje.responde (
                    "\tSi quiere continuar editando la lista pulse:\n" +
                    "\t\"L\" = Elimina último elemento.\n" +
                    "\t\"R\" = Elimina cualquier otro elemento.\n" +
                    "\t\"A\" = Añade nuevo elemento.\n" +
                    "\tCualquier otra tecla para salir.",1);
                if (lectura.length() == 0)  {  // Se ha pulsado INTRO solamente
                    presentarMenu = false;     // Salir del while anidado
                    quieresContinuar = false;  // Salir del while principal
                } else if (lectura.substring(0,1).toUpperCase().equals("L")) {          // Eliminar último elemento de la lista
                    seHaEliminado = listaCF.removeNombreDeLaLista(listaCF.getTamañoLista() - 1);
                    listaCF.presentaElementos();

                    if (seHaEliminado) { mensaje.muestra ("\tEliminada la última entrada de la lista."); }
                    else               { mensaje.muestra ("\tLa lista no tiene elementos. No se puede eliminar nada."); }
                } else if (lectura.substring(0,1).toUpperCase().equals("R")) {           // Escoger el elemento a eliminar
                    lectura = mensaje.responde ("\tPor favor.\nIntroduzca el número del elemento que quiere borrar:",0);
                    elemento = Integer.parseInt(lectura);
                    seHaEliminado = listaCF.removeNombreDeLaLista(elemento - 1);
                    listaCF.presentaElementos();

                    if (seHaEliminado) { mensaje.muestra ("\tEl elemento " + elemento + " ha sido eliminado con éxito."); }
                    else               { mensaje.muestra ("\tEl elemento " + elemento + " no se ha podido eliminar."); }
                } else if (lectura.substring(0,1).toUpperCase().equals("A")) {             // Continua pidiento entradas.
                    presentarMenu = false;    // Salir del while anidado
                } else {                      // Se ha pulsado cualquier otra cosa distinta. Salimos.
                    presentarMenu=false;      // Salir del while anidado
                    quieresContinuar = false; // Salir del while principal
                }                             // Fin del if
            }                                 // Fin while anidado presentarMenu
        } while (quieresContinuar);           // Fin del while principal quieresContinuar
        mensaje.muestra ("\tHemos salido de la lista de cantantes.\n\tGracias por su atención.");
    }                                         // Fin del main
}                                             // Fin de la clase TestCantantes
Clase ListaCantantesFamosos, crea un ArrayList con los cantantes introducidos.
Código: [Seleccionar]
import java.util.ArrayList;
/**
 * Detalles de la clase.
 *
 * @author (Toni)
 * @version (0)
 */
public class ListaCantantesFamosos {

    // Atributos de la clase ListaCantantesFamosos
    private String nombreDeLaLista;
    private ArrayList<String> lista_de_cantantes;

    /**
     * Constructor para objetos de la clase ListaCantantesFamosos
     */
    public ListaCantantesFamosos(String nombreCantante) {
        // Inicializa atributos
        nombreDeLaLista = nombreCantante;
        lista_de_cantantes = new ArrayList<String>();//Crea el objeto ArrayList con el tamaño por defecto
        //Estos tres cantantes siempre figurarán en la lista.
        addNombreNuevo("Sabina");
        addNombreNuevo("Madonna");
        addNombreNuevo("Julio Iglesias");
    } // Fin del constructor ListaCantantesFamosos

    // Siguen los setters para los atributos de la clase ListaCantantesFamosos

    // Ahora los getters para los atributos de la clase ListaCantantesFamosos

    // Y seguidamente, procedimientos y funciones varios.
    public void addNombreNuevo (String valorNombre) { lista_de_cantantes.add (valorNombre); }

    public String getNombreDeLaLista (int posicion) {
        if (posicion >= 0 && posicion < lista_de_cantantes.size()) {
            return lista_de_cantantes.get(posicion);
        } else {
            return "No hay ningún nombre en la posición: " + posicion;
        }
    }// fin del get
    public int getTamañoLista () { return lista_de_cantantes.size(); }

    public boolean removeNombreDeLaLista (int posicion) {
        if (posicion >= 0 && posicion < lista_de_cantantes.size()) {
            lista_de_cantantes.remove(posicion);
            return true;//remove OK
        } else {
            return false; // remove KO
        }
    }// fin del remove...
    /**
     * Presenta elementos del ArrayList usando un 'for extendido'
     */
    public void presentaElementos() {
        int i = 0;
        for (String nombre: lista_de_cantantes) {
            System.out.println ("Elemento " + (++i) + ": " + nombre);
        }
        if (i == 0) { System.out.println ("Sin elementos. Lista vacía."); }
    }// fin del presentaElementos
} // Fin de la clase ListaCantantesFamosos
Clase Mensaje, presenta mensajes en pantalla o/y devuelve entradas de teclado.
Código: [Seleccionar]
import java.util.Scanner;
/**
 * Detalles de la clase. El método presenta mensajes por pantalla... y devuelve entradas de teclado
 * @author (Toni)
 * @version (0)
 */
public class Mensaje { // Atributos de la clase Mensaje
    private String texto;
    private int valor;
    /**
     * Mostrará el texto con salto de línea final.
     */
    public Mensaje (String frase) { //Constructor 1 parámetro para objetos de la clase Mensaje. Inicializa atributos
        texto = frase;
        valor = 1;
        muestra (texto, valor);
    }

    /**
     * Valores param:
     * 0 = Sin salto de línea.
     * 1, u otro valor = Con salto de línea.
     */ 
    public Mensaje (String frase, int param) {
        texto = frase;
        valor = param;
        muestra (texto, valor);
    }
    // Siguen los setters para los atributos de la clase Mensaje
    public void setTexto (String texto) { this.texto = texto; }

    public void setValor (int valor)    { this.valor = valor; }
    // Ahora los getters para los atributos de la clase Mensaje
    public String getTexto ()           { return texto; }

    public int getValor ()              { return valor; }

    // Y seguidamente, procedimientos y funciones varios.
    /**
     * Mostrar el texto con salto de línea (sin segundo parámetro)
     */   
    public void muestra (String frase) {
        muestra (frase, 1);
    }// fin de muestra 1 parámetro

    /**
     * Valores param:
     * 0 = Sin salto de línea.
     * 1, u otro valor = Con salto de línea.
     */   
    public void muestra (String frase, int param) {
        texto = frase;
        valor = param;
        if (valor == 0) { System.out.print (texto + " ");
        }          else { System.out.println (texto); }
    }// fin de muestra 2 parámetros

    /**
     * Sin segundo parámetro el mensaje incluirá salto de línea. Devuelve entrada de teclado
     */
    public String responde (String frase) {
        return responde (frase, 1);
    }// fin de responde 1 parámetro

    /**
     * Valores param:
     * 0 = Sin salto de línea + entrada por teclado.
     * 1, u otro valor = Con salto de línea + entrada por teclado.
     */
    public String responde (String frase, int param) {
        texto = frase;
        valor = param;
        muestra (texto, valor);
        Scanner entradaEscaner = new Scanner(System.in);
        return entradaEscaner.nextLine();
    }// fin de responde 2 parámetros
} // Fin de la clase Mensaje
Ya me habéis dicho que hago los mains recargados. Si, lo reconozco. Pero es que quiero que hagan cosas y necesito cargarlos.
Pregunta: ¿Sería preferible desglosar el main en varios métodos aunque eso implicara más líneas de código en la clase?

Como siempre, apreciaré vuestros consejos.

Saludos
« Última modificación: 31 de Agosto 2014, 19:07 por Alex Rodríguez »

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Ejercicio propuesto CU00666B
« Respuesta #1 en: 08 de Julio 2014, 13:26 »
Hola, he revisado el código y lo veo bien elaborado, incluso has incluido opciones extra que no se pedían en el ejercicio.

A la pregunta de si sería preferible desglosar el main en varios métodos diría que sí siempre que eso aporte claridad y facilite la lectura. Si independizas un fragmento de código puede estar bien pero si independizas dos líneas eso más que aportar claridad lo que hace es complicar el código. Por tanto no crees métodos porque sí, sino solo si aportas claridad con ello.

El main no lo veo recargado, al menos teniendo en cuenta el ejercicio de que se trata y todas las cosas que has introducido, y teniendo en cuenta que has creado una estructura de clases cada una con su funcionalidad y que el programa funciona bien.

Saludos

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio propuesto CU00666B
« Respuesta #2 en: 08 de Julio 2014, 22:19 »
Hola Javi. Gracias por tus comentarios.

Entiendo que, tal como dices, separar dos líneas de código en un método distinto. Se parece más a desperdigar el código en pequeñas motas, que a dividir esfuerzos para un mismo trabajo. Voy a sopesar bien mis necesidades en cada ocasión.

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