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

SantiagoArg

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Hola gente. Quería pasárles mi primer código, del ejercicio en cuestión (CU00666B)
lo he compilado y al parecer funciona bien. No he puesto comentarios, sobre el mismo
pero para el próximo que suba lo haré por si en alguna parte el código es confuso con respecto al funcionamiento

Class ListaCantantesFamosos

Código: [Seleccionar]

import java.util.ArrayList;

public class ListaCantantesFamosos
{
    private String nombreDeLaLista;
    private ArrayList<String> listaCantantesFamosos;
   
    public ListaCantantesFamosos(String nombreLista)
    {
        nombreDeLaLista = nombreLista;
        listaCantantesFamosos = new ArrayList<String>();
        listaCantantesFamosos.add("Robert Smith");
        listaCantantesFamosos.add("Robert Plant");
        listaCantantesFamosos.add("Freddie Mercury");
        listarCantantes();
       
    }
   
    public String getCantante(int elemento)
    {
        if (elemento >= 0 && elemento < listaCantantesFamosos.size())
        { return listaCantantesFamosos.get(elemento);}
        else
        { return "no existe la posicion"; }
    }
   
    public void setCantante(String elCantante)
    { listaCantantesFamosos.add(elCantante); }
   
    public void listarCantantes()
    {
        int i = 1;
        System.out.println("Nombre de la lista: " + nombreDeLaLista);
        for(String cantante : listaCantantesFamosos)
        {
            System.out.println(i + " - " + cantante);
            i++;
        }
    }
}

Clase principal (Test)
Código: [Seleccionar]
import java.util.Scanner;

public class Test
{
   public static void main(String[] args)
   {
       ListaCantantesFamosos lista = new ListaCantantesFamosos("Fenomenos");
       Scanner sc = new Scanner(System.in);
       String entrada = "";
       System.out.println("ingrese un nuevo cantante a la lista");
       lista.setCantante((entrada = sc.nextLine()));
               
       do
       {
           System.out.println("Desea ingresar un nuevo cantante? \"Si\" o \"No\"");
           entrada = sc.nextLine();
           
           if( entrada.equals("si"))
           {
            System.out.println("Nombre:");
            lista.setCantante((entrada = sc.nextLine()));
           }           
           else
           {
               entrada = "no";
               lista.listarCantantes();
           }
       }while(!"no".equals(entrada));
       
       System.out.println("termino el programa");
   
   }
}

Nota: Tuve un inconveniente "conceptual" cuando trataba de listar dentro de la clase principal. Es decir: cuando instanciaba mi
Código: [Seleccionar]
ListaCantantesFamosos lista
y luego quería recorrerla no lo podía hacer y me arrojaba el siguiente error:

"for-each not applicable to expression type.
 required: array or java.lang.iterable; found: ListaCantantesFamosos"

Note que "mi" clase no era una lista, sino que uno de sus atributos (campos) era una lista y de ahi venia el problema, por eso definí, el método listarCantantes() dentro de la clase y ahí pude usar el "for" ya que estaba haciendo referencia al atributo ListaCantantesFamosos.

Digo esto por si alguien se encontró con el mismo problema, tal vez pueda ayudar!

Gracias a todos, ya que con sus ejemplos y comentarios me han ayudado mucho cuando me encontraba atorado con los ejercicios!!!

Saludos!
« Última modificación: 02 de Abril 2016, 18:30 por César Krall »

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Re:(CU00666B) Ejercicio con for extendido o generico
« Respuesta #1 en: 29 de Marzo 2016, 22:23 »
Buenas noches, SantiadoArg.

El ejercicio lo veo correcto, sólo comentarte que pedía:

Citar
Se debe pedir al usuario un nombre más de cantante famoso, y una vez introducido mostrar la lista actualizada usando un for extendido.

Es decir, después de entrar el cantante tienes que mostrar otra vez la lista de los cantantes, pero esta vez actualizada. Eso lo conseguimos con invocar el método "listarCantantes()" después de la entrada.

También ten cuidado en las indicaciones hacia los usuarios que utilizan tu programa. Dices que se debe contestar con "Si" o "No" y luego, dentro del bucle introduces la condicional:

Código: [Seleccionar]
if( entrada.equals("si"))
Es decir, que si yo fuera usuario que utiliza tu programa y contesto con "Si" no me entrará en la condición. Puedes omitir la importancia de que si la entrada se haya hecho en mayúsculas o minúsculas convertiendo la misma sólo en minúsculas mediante en método "toLowerCase()", pero creo que en la altura de la entrega CU00666B del curso Java desde cero aún no habéis estudiado este tema.

Todo lo demás lo veo bien.

El código de la clase "Test" con las modificaciones que te comenté quedará así:

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

public class Test
{
   public static void main(String[] args)
   {
       ListaCantantesFamosos lista = new ListaCantantesFamosos("Fenomenos");
       Scanner sc = new Scanner(System.in);
       String entrada = "";
       System.out.println("ingrese un nuevo cantante a la lista");
       lista.setCantante((entrada = sc.nextLine()));
       lista.listarCantantes();
       do
       {
           System.out.println("Desea ingresar un nuevo cantante? \"Si\" o \"No\"");
           entrada = sc.nextLine();
           entrada = entrada.toLowerCase(); //Convertir la variable "entrada" en miúsculas
           if( entrada.equals("si"))
           {
            System.out.println("Nombre:");
            lista.setCantante((entrada = sc.nextLine()));
           }           
           else
           {
               entrada = "no";
               lista.listarCantantes();
           }
       }while(!"no".equals(entrada));
       
       System.out.println("termino el programa");
   
   }
}

Pero ya te digo. Sobre la primera observación creo que te has despistado leyendo el cometido del ejercicio y no es un error porque no sabes.

Sobre el segundo, creo que es importante, no porque es un error grave, sino que el usuario se preguntará por qué no le da opción a entrar más cantantes si ha contestado que "Si".

A cerca de lo que comentas por qué no te ha listado el objeto "ListaCantantesFamosos lista", pues justamente por eso, porque es un objeto no es una array. Dentro de este objeto sí que tienes una variable que es una array y la recorres con el método "listarCantantes()" pero no lo es el objeto en sí. (Espero también que revise mi contestación un moderador de la página, porque no sé si te doy exactamente la explicación).

También quería felicitarte por el hecho de que te haya salido el ejercicio a la primera. Yo, con este ejercicio tenía bastantes más dificultades :)

Saludos.


SantiagoArg

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Re:(CU00666B) Ejercicio con for extendido o generico
« Respuesta #2 en: 30 de Marzo 2016, 16:57 »
Dimiste: Muchisimas gracias por la rapida devolución, me imagino que sabes lo importante
que es contar con una pronta respuesta y mas de gente que sabe y puede dar una gran mano mientras realizamos los ejercicios.

Si, con respecto al momento donde el usuario debe interactuar con el programa se pueden dar muchisimas opciones, pero por el momento quise darle mucho valor a la logica del diseño. De todas formas mientras avanzamos por el curso seguro vamos a ir captando nuevos metodos para validaciones y distintas formas de hacerlo.

nuevamente gracias por la ayuda!!

Saludos :)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Re:Java. for extendido o bucles for each. Ejercicio CU00666B
« Respuesta #3 en: 31 de Marzo 2016, 12:29 »
Buenas tardes, SantiagoArg.

Me alegro que te tomes de esta manera mis consejos. Realmente intento hacer correcciones constructivas y compartir lo que ya sé con los que váis por temas anteriores.

Efectivamente, en estas alturas lo que tenéis que hacer es dar prioridad a la lógica del código y no tanto centraros en los detalles. Y tanto que con el tiempo sabremos más y más cosas para poder perfeccionar aquello que de momento se nos escapa (no por ignorancia, sino simplemente porque no hemos llegado a ello).

Un saludo y a seguir así.

PD: Tanto los moderadores, colaboradores o usuarios avanzados, intentamos responder lo más rápido posible a los ejercicios. En mi caso, estoy haciendo el curso de JavaScript y la verdad que a veces me ocupa mucho tiempo para comprender según que concepto. Pero intento colaborar a la medida que pueda :)

 

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