Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado 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:
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.
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.
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.
-
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í.
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();
}
}
}
-
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.
-
Ah, de acuerdo. Muchas gracias por señalarlo, Alex.
Saludos.
-
He modificado el código para evitar el uso del while (true):
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?
-
Sí, ahora está mejor
Saludos
-
¡Gracias!