Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Erik_Escriche en 12 de Noviembre 2016, 13:10

Título: for-each not applicable to expression type required: array or java.lang CU00666B
Publicado por: Erik_Escriche en 12 de Noviembre 2016, 13:10
Buenos días.

Tratando de hacer el ejercicio de la entrega CU00666B del curso básico de Java de aprender a programar, me ha surgido un problema con el for extendido. Cuando compilo la clase, me aparece el siguiente mensaje: "for-each not applicable to expression type required: array or java.lang.Iterable; found: ListaCantantesFamosos".

Esta es la parte que me da error:
Código: [Seleccionar]
public static void main (String []args) {
        ListaCantantesFamosos prueba = new ListaCantantesFamosos();
        int i=0;
        System.out.println ("Esta es la lista que tenemos por ahora:");
        for (String z:prueba) {
                System.out.println ((i+1) + ".- " + z);
                i++;
            }

Esta es la clase completa.
Código: [Seleccionar]
public class TestCantantes2 {
    public static void main (String []args) {
        ListaCantantesFamosos prueba = new ListaCantantesFamosos();
        int i=0;
        System.out.println ("Esta es la lista que tenemos por ahora:");
        for (String z:prueba) {
                System.out.println ((i+1) + ".- " + z);
                i++;
            }
        System.out.println ("Introduce un nuevo cantante.");
        EntradaDeTeclado entrada1 = new EntradaDeTeclado();
        prueba.addCantante(entrada1.getEntrada());
        System.out.println ("Has introducido al cantante " + prueba.getCantante((prueba.getTamaño())-1) + ".");
        System.out.println ("Esta es la lista que tenemos por ahora:");
        i=0;
        for (String z:prueba) {
                System.out.println ((i+1) + ".- " + z);
                i++;
            }
       
        while (true) {
            System.out.println ("¿Quieres introducir más cantantes? Si quieres salir del programa, escribe No. Si quieres continuar, introduce el nombre de un cantante");
            EntradaDeTeclado j= new EntradaDeTeclado();
            prueba.addCantante(j.getEntrada());
            if((j.getEntrada()).equalsIgnoreCase("No")) {break;}
            System.out.println ("Esta es la lista que tenemos por ahora:");
            i=0;
            for (String z:prueba) {
                System.out.println ((i+1) + ".- " + z);
                i++;
            }
            ;
        }
    }
}


Por si fuera necesaria, dejo también aquí la clase ListaCantantesFamosos.
Código: [Seleccionar]
import java.util.ArrayList;
public class ListaCantantesFamosos {
    public ArrayList<String> listacantantes;
    //Constructor.
    public ListaCantantesFamosos () {
        listacantantes= new ArrayList<String>();
        listacantantes.add ("Harry");
        listacantantes.add("Hermione");
        listacantantes.add("Ron");
    }
    //Método para añadir mas cantantes.
    public void addCantante (String cantante) { listacantantes.add(cantante);}
   
    public int getTamaño () { return listacantantes.size();}

    public String getCantante (int posicion) {
        if (posicion>=0&&posicion<listacantantes.size()) {
            return listacantantes.get(posicion);
        } else {return "No hay tantos cantantes, tío.";}
    }
}

Cuando elimino los for extendidos, el código parece funcionar correctamente. ¿Alguien sabe dónde está el error?

Muchas gracias de antemano.
Título: Re:Error Java for-each not applicable to expression type CU00666B
Publicado por: Erik_Escriche en 12 de Noviembre 2016, 13:34
Hola de nuevo.
Ya he resuelto el error. He encontrado una explicación en otro hilo (https://www.aprenderaprogramar.com/foros/index.php?topic=4297.0). He creado un método dentro de la clase ListaCantantesFamosos para hacer la lista y el código funciona perfectamente.

El ejercicio ha quedado así.
Código: [Seleccionar]
public class TestCantantes2 {
    public static void main (String []args) {
        ListaCantantesFamosos prueba = new ListaCantantesFamosos();
        int i=0;
        System.out.println ("Esta es la lista que tenemos por ahora:");
        prueba.listarCantantes();
        System.out.println ("Introduce un nuevo cantante.");
        EntradaDeTeclado entrada1 = new EntradaDeTeclado();
        prueba.addCantante(entrada1.getEntrada());
        System.out.println ("Has introducido al cantante " + prueba.getCantante((prueba.getTamaño())-1) + ".");
        System.out.println ("Esta es la lista que tenemos por ahora:");
        prueba.listarCantantes();
       
        while (true) {
            System.out.println ("¿Quieres introducir más cantantes? Si quieres salir del programa, escribe No. Si quieres continuar, introduce el nombre de un cantante.");
            EntradaDeTeclado j= new EntradaDeTeclado();
            prueba.addCantante(j.getEntrada());
            if((j.getEntrada()).equalsIgnoreCase("No")) {break;}
            System.out.println ("Esta es la lista que tenemos por ahora:");
            prueba.listarCantantes();
       }
    }
}
Título: Re:for-each not applicable to expression type required: array or java.lang CU00666B
Publicado por: Alex Rodríguez en 20 de Noviembre 2016, 12:45
Hola Erik, en tu código tienes lo que denominamos una mala práctica o mal diseño que deberías corregir y tener en cuenta. En concreto, el uso de while (true)

Lee este hilo donde se explica esto: https://www.aprenderaprogramar.com/foros/index.php?topic=3074.0

Si te quedan dudas consulta.

Saludos.
Título: Re:for-each not applicable to expression type required: array or java.lang CU00666B
Publicado por: Erik_Escriche en 20 de Noviembre 2016, 14:19
Ah, de acuerdo. Muchas gracias por señalarlo, Alex.
Saludos.
Título: Re:for-each not applicable to expression type required: array or java.lang CU00666B
Publicado por: Erik_Escriche en 21 de Noviembre 2016, 11:50
He modificado el código para evitar el uso del while (true):

Código: [Seleccionar]
public class TestCantantes2 {
    public static void main (String []args) {
        ListaCantantesFamosos prueba = new ListaCantantesFamosos();
        int i=0;
        System.out.println ("Esta es la lista que tenemos por ahora:");
        prueba.listarCantantes();
        System.out.println ("Introduce un nuevo cantante.");
        EntradaDeTeclado entrada1 = new EntradaDeTeclado();
        prueba.addCantante(entrada1.getEntrada());
        System.out.println ("Has introducido al cantante " + prueba.getCantante((prueba.getTamaño())-1) + ".");
        System.out.println ("Esta es la lista que tenemos por ahora:");
        prueba.listarCantantes();
        String respuesta = "";
        while (!respuesta.equalsIgnoreCase("No")) {
            System.out.println ("¿Quieres introducir más cantantes? Si quieres salir del programa, escribe No. Si quieres continuar, introduce el nombre de un cantante.");
            EntradaDeTeclado j= new EntradaDeTeclado(); 
            respuesta=j.getEntrada();
            if (!respuesta.equalsIgnoreCase("No")) {
                prueba.addCantante(respuesta);           
                System.out.println ("Esta es la lista que tenemos por ahora:");
                prueba.listarCantantes();   
            }
        }
    }
}

¿Es una forma más adecuada de hacerlo?
Título: Re:for-each not applicable to expression type required: array or java.lang CU00666B
Publicado por: Alex Rodríguez en 03 de Diciembre 2016, 20:02
Sí, ahora está mejor

Saludos
Título: Re:for-each not applicable to expression type required: array or java.lang CU00666B
Publicado por: Erik_Escriche en 03 de Diciembre 2016, 20:08
¡Gracias!