Autor Tema: for-each not applicable to expression type required: array or java.lang CU00666B  (Leído 4685 veces)

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
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.
« Última modificación: 20 de Noviembre 2016, 12:43 por Alex Rodríguez »

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Re:Error Java for-each not applicable to expression type CU00666B
« Respuesta #1 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();
       }
    }
}
« Última modificación: 12 de Noviembre 2016, 13:36 por Erik_Escriche »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
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.

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Ah, de acuerdo. Muchas gracias por señalarlo, Alex.
Saludos.

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
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?

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Sí, ahora está mejor

Saludos

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
¡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".