Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Javier1996 en 15 de Septiembre 2015, 23:33

Título: El for extendido o for each no debe usar indices en bucle Java CU00666B
Publicado por: Javier1996 en 15 de Septiembre 2015, 23:33
Hola, aquí mi ejercicio sobre bucles for each  (CU00666B)

Espero que este bien y gracias por su tiempo.

Saludos!!

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). Puedes comprobar si tu código es correcto consultando en los foros aprenderaprogramar.com.

Código: [Seleccionar]
import java.util.ArrayList;
public class ListaCantantesFamosos{
    private ArrayList<String> listaCantantes;
    private String nombreLista;

    //Constructor
    public ListaCantantesFamosos(String nombreLista){
        this.nombreLista = nombreLista;
        listaCantantes = new ArrayList<String>();
        listaCantantes.add("cantante1");
        listaCantantes.add("cantante2");
        listaCantantes.add("cantente3");
    }//Cierre del constructor
   
    //Método para añadir nombres a la lista
    public void addNombre (String nombre){
        listaCantantes.add(nombre);
    }//Cierre del metodo
   
    //Método para obtener el nombre de la lista
    public String getNombreLista (){ return this.nombreLista;}//Cierre del metodo
   
    //Método para obtener el nombre que ocupa la posicion ingresada en la lista
    public String getNombreCantante (int posicion){return listaCantantes.get(posicion);}//Cierre del metodo
   
    //Método para obtener el numero de elementos de la lista
    public int getSize (){return listaCantantes.size();}//Cierre del metodo
   
    //Método para mostrar por pantalla el contenido de la lista
    public void mostrarLista(){
        int i = 0;
        for (String desenfunda: listaCantantes){
            System.out.println((i+1) + ".- " + desenfunda);
            i++;
        }
    }//Cierre del metodo
}//Cierre de la clase

Código: [Seleccionar]
import java.util.Scanner;
public class Test{
    public static void main (String [] args){
        ListaCantantesFamosos lista = new ListaCantantesFamosos("Cantantes Famosos");
        Scanner escanearEntrada = new Scanner (System.in);
        String entrada = "";
        Scanner escanearSeguir = new Scanner (System.in);
        String seguir = "";
        System.out.println("La lista de nombre " + lista.getNombreLista() + " Contiene los siguientes elementos");
        lista.mostrarLista();
        do {
            System.out.println("Ingrese un nuevo nombre a esta lista");
            entrada = escanearEntrada.nextLine();
            if ( "".equalsIgnoreCase(entrada) ){
                while ( "".equalsIgnoreCase(entrada) ){
                    System.out.println("Entrada no valida");
                    System.out.println("Ingrese un nuevo nombre a esta lista");
                    entrada = escanearEntrada.nextLine();
                }
            }
            if ( !"".equalsIgnoreCase(entrada) ){
                lista.addNombre(entrada);
                System.out.println("Se ha actualizado la lista " + lista.getNombreLista() + "\nAhora contiene los siguientes elementos");
                lista.mostrarLista();
            }
            System.out.println("¿Desea continuar agregando nombres? (escriba si o no)");
            seguir = escanearSeguir.nextLine();
            if ( !"si".equalsIgnoreCase(seguir) || !"no".equalsIgnoreCase(seguir) ){
                while ( !"si".equalsIgnoreCase(seguir) && !"no".equalsIgnoreCase(seguir) ){
                    System.out.println("Entrada no valida");
                    System.out.println("¿Desea continuar agregando nombres? (escriba si o no)");
                    seguir = escanearSeguir.nextLine();
                }
            }
        }
        while ( "si".equalsIgnoreCase(seguir) ); //Cierre del bucle

        System.out.println("El programa ha finalizado");
    }//Cierre del main
}//Cierre de la clase
Título: Re:El for extendido o for each no debe usar indices en bucle Java CU00666B
Publicado por: César Krall en 17 de Septiembre 2015, 10:24
Hola!

En la clase ListaCantantesFamosos tenemos este código:

Código: [Seleccionar]
for (String desenfunda: listaCantantes){
     System.out.println((i+1) + ".- " + desenfunda);
     i++;
}

Un for extendido es un bucle pensado para no usar índices de recorrido como la variable i. Cuando se quiera mantener un índice es preferible usar un for tradicional (que ya de por sí requiere de un índice) o un bucle while. No está prohibido, pero es algo no recomendado y que en general los programadores no usan (índices con un bucle for each).

Otra cosa a mejorar: introduces demasiada complejidad en las condiciones de la clase con el main. Demasiados if, while dentro de if, etc. indica que no es un buen diseño o planteamiento.

Mira este ejercicio resuelto: http://www.aprenderaprogramar.com/foros/index.php?topic=2262

Piensa que cuanto más simple sea tu código (siempre que cumpla con lo requerido y que esté bien planteado) mejor.

Saludos!
Título: Re:El for extendido o for each no debe usar indices en bucle Java CU00666B
Publicado por: Javier1996 en 17 de Septiembre 2015, 16:04
Hola Cesar
Gracias por tu tiempo, pero no entiendo por que esta mal el uso del contador ya que es solamente estetico y no tiene relevancia en el bucle, era para que se viera la lista un poco mas ordenada por pantalla, ademas que en el mismo ejemplo lo usan asi.
Citar
import java.util.ArrayList;
//Test del for extendido ejemplo aprenderaprogramar.com
public class TestForExtendido {
    public static void main (String [] Args) {
        ArrayList <String> jugadoresDeBaloncesto = new ArrayList<String> ();
        jugadoresDeBaloncesto.add ("Michael Jordan"); jugadoresDeBaloncesto.add ("Kobe Briant");
        jugadoresDeBaloncesto.add ("Pau Gasol"); jugadoresDeBaloncesto.add ("Drazen Petrovic");
        int i = 0;
        System.out.println ("Los jugadores de baloncesto en la lista son: ");
 
        for (String nombre : jugadoresDeBaloncesto) {  System.out.println ((i+1) + ".- " +nombre);
                                                                                       i++;  }
    } //Cierre del main
} //Cierre de la clase
y con respecto a los bucles while dentro de if era para evitar que se introdujesen cadenas vacías a la lista o se escribieran entradas distintas a las que se pedían para continuar, pero si dices que eso es un mal diseño reescribire el codigo.
saludos!!
Título: Re:El for extendido o for each no debe usar indices en bucle Java CU00666B
Publicado por: César Krall en 19 de Septiembre 2015, 12:16
Hola Javier, supón que eres un empleado de un banco y que en tu mesa de la oficina llega un chorro de aire acondicionado que te da frío. Ahora supón que pones un paraguas apoyado sobre la mesa para evitar que el aire acondicionado te dé de lleno. ¿Está mal? No ¿Es efectivo? Sí. Sin embargo tus compañeros te mirarán extrañados porque no es algo habitual, se sale de la convención. Con el contador en un for extendido pasa algo parecido, puedes usarlo si quieres, pero tus compañeros programadores te mirarán extrañados. Con el diseño pasa lo mismo. Si puede resolverse con un diseño sencillo resolverlo de una forma complicada no será bien visto ni siquiera aunque funcione bien.

Saludos!