Autor Tema: Java ejercicios resueltos responsabilidades de cada clase y del main CU00666B  (Leído 2163 veces)

Cpantoja

  • Sin experiencia
  • *
  • Mensajes: 11
  • En la vida nunca se termina de aprender.
    • Ver Perfil
Estimados compañeros del foro, envío solución propuesta del ejercicio CU00666B del curso de programación Java para principiantes.

Saludos.


Clase ListaCantantesFamosos

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

public class ListaCantantesFamosos {
    ArrayList <String> listaCantantes; //Declaración del objeto ArrayList
    private String entradaTeclado;
   
    Scanner entradaEscaner;
    //Constructor de la clase
    public ListaCantantesFamosos() {
       
        listaCantantes = new ArrayList<String> (); //Inicialización del objeto ArrayList
       
        listaCantantes.add("Jose Jose");
        listaCantantes.add("Alejandra Guzman");
        listaCantantes.add("Julio Iglesias");
    }//Cierre del constructor
    //Metodo para agregar nombres a los cantantes de la lista
        public void addNombre(String valor_nombre) {
            listaCantantes.add(valor_nombre);
        }
    //Método para obtener el nombre de la lista
    public String getNombre(int posicion) {
        if(posicion >= 0 && posicion < listaCantantes.size()) {
            return listaCantantes.get(posicion);
        }else {
            return "No existe nombre para la posición solicitada";
        }
    }//Cierre del método
    //Método para capturar entrada de teclado del usuario
    public void digitarNombre() {
        entradaEscaner = new Scanner(System.in);
        entradaTeclado = entradaEscaner.nextLine();
       
    }
    //Método para obtener el texto capturado
    public String getEntrada() {
        return entradaTeclado;
    }
   
}

Clase Main

Código: [Seleccionar]
public class TestListaCantantes{
    public static void main(String[] args) {
       
        //Creación de instancia para la clase ListaCantantesFamosos
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos();
       
        System.out.println("Los cantantes famosos en la lista son: ");
       
        int i = 0;
     
        for(String nombre: lista1.listaCantantes) {
            System.out.println((i+1) + ".- " + nombre);
            i++;   
    }
        i = 0; //Reiniciando variable que enumera los nombres
        System.out.println("Por favor introduzca el nombre de otro cantante: ");
            lista1.digitarNombre();
            System.out.println("--Gracias--");
           
            lista1.addNombre(lista1.getEntrada());
           
            System.out.println("La nueva lista esta compuesta por: ");
           
            for(String nombre: lista1.listaCantantes) {
                System.out.println((i+1) + ".- " + nombre);
                i++;
            }
           
            int cont = 1;
            while(cont == 1){ //Bucle que da a elegir al usuario si desea ingresar más nombres
           
            i = 0;
            String opcion = "";
            System.out.println("¿Deseas agregar otro nombre de cantante? s / n");
             lista1.digitarNombre();
             opcion = lista1.getEntrada();
           
                if(opcion.equals("s")) {
                   cont = 1;
                    System.out.println("Por favor introduzca el nombre de otro cantante: ");
            lista1.digitarNombre();
            System.out.println("--Gracias--");
           
            lista1.addNombre(lista1.getEntrada());
           
            System.out.println("La nueva lista esta compuesta por: ");
           
            for(String nombre: lista1.listaCantantes) {
                System.out.println((i+1) + ".- " + nombre);
                i++;
            }
       
                } else if(opcion.equals("n")) {
                    cont = 0;
                    i = 0;
                    System.out.println("Fin del programa");
                }
                else{ //Opción resultante en caso de no introducir s / n
                    cont = 0;
                    System.out.println("Opción no existe. Fin del programa");
                }
           
            }
        }
    }
« Última modificación: 26 de Octubre 2020, 18:19 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Java el for extendido o bucles for each - CU00666B
« Respuesta #1 en: 31 de Julio 2020, 13:10 »
Hola.
El código está bien y cumple lo que se pide el enunciado.
Pero hay algunas cosas que yo cambiaría.

Primero, yo no haría la petición de datos por teclado desde la clase ListaCantantesFamosos.
Esta clase debe recibir los datos, pero no necesariamente ser quien las pida.

Me refiero a que el objeto Scanner para pedir datos, lo pondría en la clase Main y que se encargue ella de pedir los datos y pasárselos a ListaCantantesFamosos.

Que si se quiere, se puede hacer que sea ListaCantantesFamosos quien pida los datos con un Scanner, pero al menos a mí, me parece más lógico que sea la clase Main quien se encargue de esa tarea.

Fíjate que luego en el Main, para preguntar al usuario si quiere repetir el bucle para seguir añadiendo nombres, usas un método perteneciente a  ListaCantantesFamosos para esta entrada de datos.
ListaCantantesFamosos ha de modelar y gestionar una lista de nombres, no debería tener que encargarse de pedir el dato que decide si el bucle de otra clase distinta se va a repetir o no.

Cada clase ha de encargarse de lo "suyo". Y esto me lleva a otro cambio que haría.
El bucle for extendido, tú lo haces desde la clase Main. Y para que esta clase pueda acceder al atributo ArrayList de cantantes, no puedes poner como private dicho atributo, que en principio es lo ideal.
Sería mejor que sea la propia clase ListaCantantesFamosos quien tenga un método que se encargue de recorrer y mostrar la lista con el for extendido.
Así, no tendrá necesidad de que clases ajenas puedan acceder directamente a su atributo ArrayList.

Y por último, para optimizar más el código, en el Main yo usaría un do while para pedir al usuario nuevos nombres y evaluar si quiere continuar.

Este bucle, como la condición de salida se evalúa al final, garantiza que al menos una vez se va a ejecutar el código que contiene.
Como el enunciado pide que solicitemos al menos un nombre al usuario, este bucle nos viene bien para pedir ese nombre obligatorio y luego ya el usuario decide si continuar o no.

Te pongo aquí el código que yo haría. Échale un vistazo para comparar los cambios.
Puede que antes previamente quieras intentar por tu cuenta hacer un nuevo código con los cambios que he comentado, pero si no te ha quedado claro lo que he intentado explicar, seguramente te será más revelador si ves mi código.
Pregunta lo que sea, un saludo.  ;)

Clase ListaCantantesFamosos
Código: [Seleccionar]
public class ListaCantantesFamosos {

private ArrayList<String> listaCantantes;

public ListaCantantesFamosos() {
listaCantantes = new ArrayList<String>();
listaCantantes.add("Jose Jose");
listaCantantes.add("Alejandra Guzman");
listaCantantes.add("Julio Iglesias");
}

public void mostrarLista() {
System.out.println("\nLista de Cantantes");
System.out.println("----- -- ---------\n");
int i = 1;
for (String cantante: listaCantantes) {
System.out.println(i + "# " + cantante);
i++;
}
}

public void addCantante(String cantante) {
listaCantantes.add(cantante);
}

}

Clase Main
Código: [Seleccionar]
public class Test {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
ListaCantantesFamosos lista = new ListaCantantesFamosos();
String nuevoCantante = "";
String continuar = "s";

lista.mostrarLista();

do {

System.out.print("\nAñada un nuevo cantante: ");
nuevoCantante = teclado.nextLine();
lista.addCantante(nuevoCantante);

lista.mostrarLista();

System.out.print("¿Desea añadir más cantantes?(s/n): ");
continuar = teclado.nextLine();
}while(continuar.equals("s"));

teclado.close();
System.out.println("\n\t\tFIN DE PROGRAMA");
}

}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Cpantoja

  • Sin experiencia
  • *
  • Mensajes: 11
  • En la vida nunca se termina de aprender.
    • Ver Perfil
Re:Java el for extendido o bucles for each - CU00666B
« Respuesta #2 en: 31 de Julio 2020, 20:15 »
Hola Kabuto
Te agradezco las observaciones, intentaré hacer los cambios en base a las sugerencias planteadas y luego lo compararé con vuestro código para medir mi nivel de comprensión del tema, de nuevo Gracias.

Saludos.

Cpantoja

  • Sin experiencia
  • *
  • Mensajes: 11
  • En la vida nunca se termina de aprender.
    • Ver Perfil
Re:Java el for extendido o bucles for each - CU00666B
« Respuesta #3 en: 05 de Agosto 2020, 00:36 »
Hola estimados
Atendiendo a las correcciones planteadas, presento el código ya con las correcciones respectivas.

Saludos.

Clase ListaCantantesFamosos

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

public class ListaCantantesFamosos {
    ArrayList <String> listaCantantes; //Declaración del objeto ArrayList
    private String entradaTeclado;
   
    //Constructor de la clase
    public ListaCantantesFamosos() {
       
        listaCantantes = new ArrayList<String> (); //Inicialización del objeto ArrayList
       
        listaCantantes.add("Jose Jose");
        listaCantantes.add("Alejandra Guzman");
        listaCantantes.add("Julio Iglesias");
    }//Cierre del constructor

//Método para mostrar la lista de cantantes del ArrayList
public void mostrarLista(){
    int i = 1;     
        for(String nombre:  listaCantantes) {
            System.out.println((i) + ".- " + nombre);
            i++;   
    }
}

    //Metodo para agregar nombres de cantantes a la lista
        public void addNombre(String valor_nombre) {
            listaCantantes.add(valor_nombre);
        }
   
   
}



Clase TestListaCantantes

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

public class TestListaCantantes{
    public static void main(String[] args) {

     String nuevoCantante = "";
     String decision = "";

    //Creación de Instancia para la clase Scanner
        Scanner entradaEscaner = new Scanner(System.in);
         
            //Creación de instancia para la clase ListaCantantesFamosos
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos();
       
        System.out.println("Los cantantes famosos en la lista son: ");
        System.out.println("");
        lista1.mostrarLista();       
       
        do {
            System.out.println("\nPor favor introduzca el nombre de otro cantante: ");
    nuevoCantante = entradaEscaner.nextLine();
    lista1.addNombre(nuevoCantante);
    System.out.println("--Gracias--");

    System.out.println("\nLa nueva lista esta compuesta por: ");
    System.out.println("");
                lista1.mostrarLista();           
    System.out.println("\n¿Desea agregar otro cantante? s/n");
    decision = entradaEscaner.nextLine();
} while (decision.equals("s"));
   
if(decision.equals("n")) {
                   
                    System.out.println("Fin del programa");
                }
                else{     //Opción resultante en caso de no introducir s / n
                 
                    System.out.println("Opción no válida. Fin del programa");
                }
           
            }
        }
   



Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Java el for extendido o bucles for each - CU00666B
« Respuesta #4 en: 05 de Agosto 2020, 01:22 »
Ok.

Lo único a mencionar es que de esta clase ya puedes quitar estas dos líneas:

Citar
import java.util.ArrayList;
import java.util.Scanner;

public class ListaCantantesFamosos {
    ArrayList <String> listaCantantes; //Declaración del objeto ArrayList
    private String entradaTeclado;

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. 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".