Autor Tema: El for extendido o bucles for each en Java (CU00666B) Ejercicio Resuelto  (Leído 4417 veces)

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola!!

EJERCICIO CU00666B

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

Código: [Seleccionar]
public class Test {

    static ListaCantantesFamosos lista; //es estatico ya que lo vamos a inicializar y usar dentro del metodo main

    public static void main (String[] args) {

        lista = new ListaCantantesFamosos();
       
        System.out.println("\nMostrando lista Actual\n");
        lista.getListaCompleta();
        cantanteOpcional();
    }

    static void cantanteOpcional() {

        EntradaDeTeclado respuestaUsuario, ingresoCantante; //declaramos dos objetos de tipo EntradaDeTeclado

        do {
            System.out.println("\nDesea ingresar otro cantante? Y / N");
            respuestaUsuario = new EntradaDeTeclado();
            if (respuestaUsuario.getEntrada().toLowerCase().equals("y")) {
                System.out.println("\nIngrese otro cantante");
                ingresoCantante = new EntradaDeTeclado();
                //agregando el cantante ingresado al objeto lista
                lista.addCantante(ingresoCantante.getEntrada());
                System.out.println("Cantante agregado satisfactoriamente\n");
                System.out.println("Mostrando lista actualizada\n");
                lista.getListaCompleta();

            }else if (respuestaUsuario.getEntrada().toLowerCase().equals("n")) {
                break; //cuando la respuesta es "n" rompemos el loop do-while

            } else { //si respuesta distinta de "y" o "n" repreguntamos
                System.out.println("Por favor, ingrese Y o N");
                respuestaUsuario.setEntrada("y");
                /*cambiamos el valor por "y" para que se cumple la condicion en el while siguiente
                para ejecutar la sentencia del do nuevamente.
                Para poder cambiar el valor de respuestaUsuario agregamos un metodo setEntrada en la
                clase EntradaDeTeclado*/
                }
        }// fin de do
        while (respuestaUsuario.getEntrada().toLowerCase().equals("y"));
        System.out.println("\nMostrando lista final\n");
        lista.getListaCompleta();
        System.out.println("\nPrograma terminado");
    }
}

Usé la misma clase ListaCantantesFamosos anterior y modicando el metodo getListaCompleta con el for each

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

public class ListaCantantesFamosos {

    private ArrayList<String> listaCantantes;
    //constructor que inicializa el objeto listaCantantes y agrega 3 cantantes(strings)
    public ListaCantantesFamosos () {
        listaCantantes = new ArrayList<String>();
        listaCantantes.add("Bono"); listaCantantes.add("Freddie Mercury"); listaCantantes.add("Shakira");
    }
    //metodo para agregar otros strings
    public void addCantante (String nombre) { listaCantantes.add(nombre); }
    //metodo que devuelve todo el contenido del ArrayList listaCantantes
    public void getListaCompleta () {
        int i = 0;
        for (String nombre : listaCantantes) {
            System.out.println("Cantante "+(i+1)+" : "+nombre);
            i++;
        }
    }
}

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

public class EntradaDeTeclado {
    private String entradaTeclado;

    public EntradaDeTeclado ()  {
        entradaTeclado="";
        pedirEntrada(); //llamada al metodo interno
    }

    public void pedirEntrada ()  {         
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine ();     }

    public void setEntrada (String entradaTeclado)  {
        this.entradaTeclado=entradaTeclado;
    }

    public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
} //Cierre de la clase

Gracias!!
« Última modificación: 16 de Julio 2015, 14:25 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
Hola adrit, en la clase ListaCantantesFamosos usas un índice en un for extendido.

Código: [Seleccionar]
    public void getListaCompleta () {
        int i = 0;
        for (String nombre : listaCantantes) {
            System.out.println("Cantante "+(i+1)+" : "+nombre);
            i++;
        }
    }

En otros hilos del foro ya se ha comentado que si se usa un for de este tipo normalmente no se usan índices numéricos. En caso de usar índices numéricos se usa un for tradicional.


Otro detalle a comentar es

Código: [Seleccionar]
respuestaUsuario.getEntrada().toLowerCase().equals("y")
En lugar de esto puedes usar

Código: [Seleccionar]
respuestaUsuario.getEntrada().equalsIgnoreCase("y")
De este modo admites tanto y minúscula como Y mayúscula.


En la clase Test deberías mejorar el planteamiento del bucle para pedir datos al usuario. Normalmente no debemos usar break para salir de un bucle. Sería bueno que corrijas esto y lo reescribas sin usar break (es decir, la salida del bucle debería estar controlada desde la condici´no del bucle,, no usando un break). Puedes fijarte en ejemplos de otros compañeros en los foros, para ello busca la clave CU00666B en el buscador del foro. Por ejemplo puedes ver ejercicios resueltos como este https://www.aprenderaprogramar.com/foros/index.php?topic=2262

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

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Cesar, agradezco mucho tu devolución!

Hice correcciones y me gustaría mostrarte como quedó el codigo

En ListaCantantesFamosos saqué el indice numérico ya que la consigna pide hacerlo con un for extendido
Código: [Seleccionar]
import java.util.ArrayList;

public class ListaCantantesFamosos {

    private ArrayList<String> listaCantantes;
    //constructor que inicializa el objeto listaCantantes y agrega 3 cantantes(strings)
    public ListaCantantesFamosos () {
        listaCantantes = new ArrayList<String>();
        listaCantantes.add("Bono"); listaCantantes.add("Freddie Mercury"); listaCantantes.add("Shakira");
    }
    //metodo para agregar otros strings
    public void addCantante (String nombre) { listaCantantes.add(nombre); }
    //metodo que devuelve todo el contenido del ArrayList listaCantantes
    public void getListaCompleta () {
        for (String nombre : listaCantantes) {
            System.out.println("Cantante : "+nombre);
        }
    }
}

El main modificado

Código: [Seleccionar]
public class Test {

    static ListaCantantesFamosos lista; //es estatico ya que lo vamos a inicializar y usar dentro del metodo main

    public static void main (String[] args) {

        lista = new ListaCantantesFamosos();
       
        System.out.println("\nMostrando lista Actual\n");
        lista.getListaCompleta();
        cantanteOpcional();
    }

    static void cantanteOpcional() {

        EntradaDeTeclado respuestaUsuario, ingresoCantante; //declaramos dos objetos de tipo EntradaDeTeclado

        do {
            System.out.println("\nDesea ingresar otro cantante? Y / N");
            respuestaUsuario = new EntradaDeTeclado();
            if (respuestaUsuario.getEntrada().equalsIgnoreCase("y")) {
                System.out.println("\nIngrese otro cantante");
                ingresoCantante = new EntradaDeTeclado();
                //agregando el cantante ingresado al objeto lista
                lista.addCantante(ingresoCantante.getEntrada());
                System.out.println("Cantante agregado satisfactoriamente\n");
                System.out.println("Mostrando lista actualizada\n");
                lista.getListaCompleta();

            }else if (respuestaUsuario.getEntrada().equalsIgnoreCase("n")) {
                //aca respuestaUsuario.getEntrada() es igual a "n" entonces se repite el do por la condicion del while.
                //por lo tanto este if lo dejo en blanco

            } else { //si respuesta distinta de "y" o "n" repreguntamos
                System.out.println("Por favor, ingrese Y o N");
                respuestaUsuario.setEntrada("y");
                /*cambiamos el valor por "y" para que se cumple la condición en el while siguiente
                para ejecutar la sentencia del do nuevamente.
                Para poder cambiar el valor de respuestaUsuario agregamos un metodo setEntrada en la
                clase EntradaDeTeclado*/
                }
        }// fin de do
        while (respuestaUsuario.getEntrada().equalsIgnoreCase("y"));
        System.out.println("\nMostrando lista final\n");
        lista.getListaCompleta();
        System.out.println("\nPrograma terminado");
    }
}

Muchas gracias!

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Ahora bastante mejor!

Todavía se puede mejorar ya que tienes un condicional else if que está vacío y que realmente no es necesario.

Queda más simple así:

Código: [Seleccionar]
    static void cantanteOpcional() {

        EntradaDeTeclado respuestaUsuario, ingresoCantante; //declaramos dos objetos de tipo EntradaDeTeclado

        do {
            System.out.println("\nDesea ingresar otro cantante? Y / N");
            respuestaUsuario = new EntradaDeTeclado();
            if (respuestaUsuario.getEntrada().equalsIgnoreCase("y")) {
                System.out.println("\nIngrese otro cantante");
                ingresoCantante = new EntradaDeTeclado();
                //agregando el cantante ingresado al objeto lista
                lista.addCantante(ingresoCantante.getEntrada());
                System.out.println("Cantante agregado satisfactoriamente\n");
                System.out.println("Mostrando lista actualizada\n");
                lista.getListaCompleta();

            }else if (respuestaUsuario.getEntrada().equalsIgnoreCase("n") == false) {
                System.out.println("Por favor, ingrese Y o N");
                respuestaUsuario.setEntrada("y");
            }
        }// fin de do
        while (respuestaUsuario.getEntrada().equalsIgnoreCase("y"));
        System.out.println("\nMostrando lista final\n");
        lista.getListaCompleta();
        System.out.println("\nPrograma terminado");
    }

Aquí la lógica sería: si escribe y seguimos el primer if, si no ha escrito y y tampoco escribe n le pedimos que ingrese y o n

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

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Excelente!

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