Autor Tema: Aprender a programar desde cero / Ejercicio CU00666B for extendido o for each  (Leído 2664 veces)

Eduardo_M

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Estimados: muchas gracias por su tiempo adjunto mi ejercicio. Y agradeceré cualquier retroalimentación.

Este es el código de la clase ListaCantantesFamosos:

Código: [Seleccionar]
import java.util.ArrayList; //importamos una lista redimensionable ArrayList
//Esta clase representa una lista de cantantes famosos manejada con la clase ArrayList
public class ListaCantantesFamosos
{
    private String nombreDeCantantes; //Establecemos un atributo nombre de cantantes
    public ArrayList<String> listadecantantes; //Declaramos un ArrayList que contiene objetos String
    public ListaCantantesFamosos(String nombre) //Constructor: creamos una lista de cantantes famosos y establecemos 3 cantantes famosos
    {
        nombreDeCantantes = nombre;
        listadecantantes = new ArrayList<String>();
        listadecantantes.add("Silvio Rodriguez");
        listadecantantes.add("Pablo Milanez");
        listadecantantes.add("Joan Manuel Serrat");       
    } //cierre del constructor

    public void addNombre(String nombre_cantante) { listadecantantes.add(nombre_cantante);} //Metodo addNombre donde se agregar el nombre del cantante famoso

    public String getNombre (int posicion) { //Método getNombre para obtener el nombre del cantente famoso
        if (posicion >= 0 && posicion < listadecantantes.size() ) {
            return listadecantantes.get(posicion); }
        else { return "No existe nombre para la posición solicitada";}
    } //Cierre del método
    public int getTamaño () { return listadecantantes.size(); } //Cierre del método
    public void removeNombre (int posicion) { //Método
        if (posicion >= 0 && posicion < listadecantantes.size() ) {
            listadecantantes.remove(posicion); }
        else { } //else vacío. No existe nombre para la posición solicitada, no se ejecuta ninguna instrucción
    } //Cierre del método removeNombre
}

Este es el código de la clase EntradaDeTeclado:
Código: [Seleccionar]
import java.util.Scanner; //Importación del código de la clase Scanner desde la biblioteca Java
// Definimos una clase EntradaDeTeclado aprenderaprogramar.com
public class EntradaDeTeclado {
    private String entradaTeclado; //Variable de instancia (campo) de la clase
    public EntradaDeTeclado () { //Constructor
        entradaTeclado="";
        pedirEntrada(); //Esto es una llamada a un método interno. Al crear un objeto automáticamente ejecutamos el método
    } //Cierre del constructor
    public void pedirEntrada () { //Método de la clase
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine (); } //Cierre del método pedirEntrada
    public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
    public String getPrimeraPalabra () {
        /*//IMPORTANTÍSIMO: EN JAVA LOS OBJETOS NO SE PUEDEN COMPARAR USANDO == POR ESO ESTO NO FUNCIONARÁ
        if (entradaTeclado.substring(0,1)=="j") {
        System.out.println ("Hemos detectado una j");
        } else { System.out.println ("Mira esto:" + entradaTeclado.substring(0,1) ); }*/
        for (int i=0; i < entradaTeclado.length() - 1; i++) {
            if (entradaTeclado.substring (i, i+1).equals(" ") ) { //IMPORTANTÍSIMO: COMPARAMOS CON EQUALS
                return entradaTeclado.substring(0, i+1); }
        }
        return entradaTeclado; //Caso de que no se detecte ningún espacio devolvemos lo que haya
    } //Cierre del método getPrimeraPalabra
    public int getLongitud () { //Método de la clase
        return entradaTeclado.length();
    } //Cierre del método getLongitud
} //Cierre de la clase

Código de la clase principal TestListaCantantesFamosos:
Código: [Seleccionar]
public class TestListaCantantesFamosos
{
    public static void main (String [ ] args) {
        System.out.println ("Mostramos los siguientes Cantantes Famosos previamente almacenados");
        ListaCantantesFamosos famosos1 = new ListaCantantesFamosos("Nombres de Cantantes Famosos introducidos por usuario");

        int i = 0;
        for (String nombre : famosos1.listadecantantes) { System.out.println ((i+1) + ".- " +nombre);
            i++; }

        boolean salida = false;
        while (salida == false) {
            System.out.println ("¿Desea agregar mas nombres de Cantantes Famosos?(Si/No)");
            EntradaDeTeclado repsuestaSiNo = new EntradaDeTeclado();   
            String SiNo = repsuestaSiNo.getEntrada();

            if (SiNo.equalsIgnoreCase("si")){   
                System.out.println ("Por favor introduzca el nombre de otro Cantante Famoso: "); EntradaDeTeclado entrada1 = new EntradaDeTeclado();
                famosos1.addNombre (entrada1.getEntrada());
                int j = 0;
                System.out.println ("Mostramos la lista actualizada de los Cantantes Famosos");
                for (String nombre : famosos1.listadecantantes) { System.out.println ((j+1) + ".- " +nombre);
                    j++; }
            } else {System.out.println ("Gracias"); salida = true; }
        }       
    } //Cierre del main
}

Muchas gracias por su tiempo. Saludos

Eduardo
« Última modificación: 27 de Marzo 2015, 08:25 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola Eduardo

Tu ejercicio está muy bien. Y cumple todas las peticiones del enunciado. OK

Quiero darte unos apuntes para mejorar el código:

En primer lugar decirte que una de las convenciones de Java se refiere a los nombres de atributos, variables y métodos.
La convención (que no obligación) de bautizar estos objetos con palabras que empiezan con minúscula, y si el nombre es una palabra compuesta, cada una de las siguientes empezará con mayúscula.
Con esta convención tu atributo listadecantantes pasaría a llamarse listaDeCantantes.
Únicamente las clases empiezan con mayúscula, precisamente para diferenciarse de variables y métodos.


En segundo lugar, otra convención es declarar los atributos de una clase como private (salvo raras excepciones)

¿Porque motivo?
Pues para que haya una única forma de gestionar la información sobre el atributo, a saber, sus métodos set y get (que siempre son públicos)


Finalmente, para contribuir a la encapsulación de la información y eficiencia del código deberías colocar el for extendido que tienes repetido en la clase TestListaCantantesFamosos en la clase ListaCantantesFamosos que es la propietaria de la información que manipula ese for extendido.

Es decir crear en la clase ListaCantantesFamosos un método que se podría llamar, no sé, a ver:
    muestrameTodosLosCantantesQueTengoEnMiLista
que usando tu for extendido mostrara la información.
De esta forma cualquier clase puede pedir la lista de cantantes famosos sin tener que escribir código pues ya está incorporado en la clase ListaCantantesFamosos.

Naturalmente al método le puedes dar un nombre más corto, pero siempre descriptivo del trabajo que hace.

Saludos

 

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