Autor Tema: Java desde Cero Ejercicio clase que representa una lista de cantantes CU00666B  (Leído 3614 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola dejo el Ejercicio  CU00666B del curso gratuito de programación Java de aprenderaprogramar. El for extendido o bucles for each en Java. 

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

Clase ListaDeCantantesFamosos

Código: [Seleccionar]
//Ejemplo de uso ArrayList aprenderaprogramar.com
import java.util.ArrayList; //Los import deben ir siempre al principio antes de declarar la clase
//Esta clase representa una lista de nombres manejada con la clase ArrayList de Java
public class ListaCantantesFamosos {
  private ArrayList<String> listaCantantes; //Declaramos un ArrayList que contiene objetos String
   
    public ListaCantantesFamosos (String nombre) {    //Constructor: crea una lista de nombres vacía
        listaCantantes = new ArrayList<String>(); //Creamos el objeto de tipo ArrayList
    listaCantantes.add("Antonio Machin");
    listaCantantes.add("Jorge Negrete");
    listaCantantes.add("Antoñita Pañuela");
   
    } //Cierre del constructor

    public void addNombre (String valor_nombre) { listaCantantes.add (valor_nombre); } //Cierre del método
   
    public String getNombre (int posicion) { //Método
        if (posicion >= 0 && posicion < listaCantantes.size() ) {
            return listaCantantes.get(posicion); }
        else { return "No existe nombre para la posición solicitada";}
    } //Cierre del método 
   
    public int getTamaño () { return listaCantantes.size(); } //Cierre del método

    public void removeNombre (int posicion) {  //Método
        if (posicion >= 0 && posicion < listaCantantes.size() ) {

            listaCantantes.remove(posicion); }

        else { } //else vacío. No existe nombre para la posición solicitada, no se ejecuta ninguna instrucción
    } //Cierre del método removeNombre
 /* *******************************************************************
  ********************* FOR EXTENDIDO *******************************
  ****************************************************************** */ 
    public void mostrarCantantes(){
        int n=1;
        for(String i: listaCantantes){
        System.out.println ("Elemento "+(n)+": " + i );
        n++;
    }
}
} //Cierre de la clase

Clase EntradaDeTeclado
Código: [Seleccionar]
import java.util.Scanner; //Importación del código de la clase Scanner desde la biblioteca Java
// Definimos una clase EntradaDeTeclado aprenderaprogramar.com
public class EntradaDeTeclado {
    private String entradaTeclado; //Variable de instancia (campo) de la clase
    public EntradaDeTeclado ()  { //Constructor
        entradaTeclado="";
        PedirEntrada(); //Esto es una llamada a un método interno. Al crear un objeto ejecutamos el método
    } //Cierre del constructor

    public void PedirEntrada ()  {  //Método de la clase         
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine ();     } //Cierre del método pedirEntrada
    public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
   
    public int getLongitud ()  {  //Método de la clase

        return entradaTeclado.length();

    } //Cierre del método getLongitud

 
} //Cierre de la clase

Clase TestListaCantantesFamosos

Código: [Seleccionar]
// Aquí el test con el método main ejemplo aprenderaprogramar.com
public class TestListaCantantesFamosos {
    public static void main (String [ ] args) {
        System.out.print ("EjercicioCU00666B\n\n");
        System.out.print ("Introduzca nombres de cantantes.\nPara finalizar Pulse INTRO solamente\n\n");
        System.out.print ("Empezamos el programa\n");
        String fuera;// Cadena para comparar si es espacio vacio
        boolean fin=false;// Variable booleana si es true finaliza el programa
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos("Nombres introducidos por usuario");
        System.out.println ("La lista esta formada por " + lista1.getTamaño() + " elementos");
        lista1.mostrarCantantes();
        System.out.println ("Por favor introduzca un nombre (INTRO PARA FINALIZAR):"); 
        do
        {
            EntradaDeTeclado entrada1 = new EntradaDeTeclado();
            fuera=entrada1.getEntrada();//Variable que de cadena para sacar la entrada por teclado
            fin=fuera.substring(0,entrada1.getLongitud ()).equals("");//Si es espacio vacio para salir del bucle
            if(fin==false){ // Si es espacio vacio no se graba la ultima entrada y se sale del bucle
            lista1.addNombre (entrada1.getEntrada() );
            System.out.println ("Lista actualizada con :" + lista1.getTamaño() + " elementos\n INTRO PARA FINALIZAR");
            lista1.mostrarCantantes();
        }
       
        }while(!fin);
       
         
        System.out.print ("******************* Gracias ************************\n\n");

        System.out.println ("La lista ha quedado formada por " + lista1.getTamaño() + " elementos");
        lista1.mostrarCantantes();
         System.out.print ("\n******************* Gracias ************************");
    } //Cierre del main

} //Cierre de la clase
Gracias. ;)
« Última modificación: 13 de Diciembre 2018, 21:14 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas, el código funciona bien y tiene una buena solución para evitar tener que estar respondiendo continuamente ¿Quiere continuar? (s/n), de hecho es mucho más cómodo como lo has programado, y es interesante para quien esté buscando formas de solucionar el ejercicio ver cómo lo has planteado. Un par de cosas a comentar. El for extendido está en la clase ListaCantantesFamosos y no en el main, lo cual está bien, aunque el enunciado parece más bien pedir que esté en el main. Creo que puede darse por bueno tanto una cosa como otra. En cuanto al uso de un contador con un for extendido, creo que es interesante que se lea lo que se comenta en https://aprenderaprogramar.com/foros/index.php?topic=3210.0

Salu2

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Gracias Ogramar por corregirme el ejercicio.

Con el for extendido se me fue el santo al cielo y no pensé que tendría que estar en el main.
Lo del contador esta bien lo que se comenta en el hilo que tu me envías.

En el curso se aconseja no utilizar los contadores dentro de un for extendido pero solo eso, solo se aconseja ( aun que yo no entiendo porque ).

Yo creo que se puede utilizar el contador si solamente es para presentar por pantalla el numero de veces que se ejecuta el bucle y saber  el numero de elementos que hay en la lista, siempre que no interfiera ese contador o esa variable en el funcionamiento del for extendido.
Pienso que seria una barbaridad tener que implementar mas código para poder presentar el numero de veces que se ejecuta el bucle.

Una solución posible seria crear un for en el main fuera del for extendido con la longitud de la lista ( for(int i=0;1<lista1.getTamaño();i++){mas código para sacar los elementos de la lista } ) con la consiguiente  redundancia de código y cargando mas peso al programa, cuando con una variable y un sumador se arregla el tema.

Lo que trato de hacer con ese contador es evitar la redundancia de código o evitar de escribir código innecesario, ya que en programas muy extensos si vamos escribiendo trozos de código (10 0 12 lineas) que se podrían solucionar con una o dos, al final hay un follón de código que a la hora de analizarlo nos podemos volver tarumbas.

De todas las maneras hay que tener mucho cuidado con esos contadores ya que  si los utilizamos sin ser conscientes de que están por hay al final nos pueden dar problemas.

Gracias Ogramar un saludo. :D ;)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas, se aconseja porque si necesitas contar en general es preferible usar un for normal (con contador) en lugar de usar un for extendido. En el for normal ya tienes el contador incorporado y no tienes que preocuparte por esa cuestión. Es decir, si no hubiera que hacerlo con un for extendido porque lo pide el ejercicio, bastaría usar

    public void mostrarCantantes(){
        for(int i=0;1<getTamaño();i++){
        System.out.println ("Elemento "+(i+1)+": " + getNombre(i) );
    }

y dejar que el control del contador lo lleve el propio for.

Pero como tú dices, puedes usar un contador en un for extendido (si quieres). Y también como has indicado, cuanto más compacto y menos redundante sea el código, mejor.

Salu2

 

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