Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Cpantoja en 31 de Julio 2020, 04:23
-
Estimados compañeros del foro, envío solución propuesta del ejercicio CU00666B del curso de programación Java para principiantes.
Saludos.
Clase ListaCantantesFamosos
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
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");
}
}
}
}
-
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 (https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=625:while-y-do-while-en-java-ciclos-o-bucles-ejemplo-break-salir-de-un-bucle-ejercicios-resueltos-cu00659b&catid=68&Itemid=188) 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
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
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");
}
}
-
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.
-
Hola estimados
Atendiendo a las correcciones planteadas, presento el código ya con las correcciones respectivas.
Saludos.
Clase ListaCantantesFamosos
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
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");
}
}
}
-
Ok.
Lo único a mencionar es que de esta clase ya puedes quitar estas dos líneas:
import java.util.ArrayList;
import java.util.Scanner;
public class ListaCantantesFamosos {
ArrayList <String> listaCantantes; //Declaración del objeto ArrayList
private String entradaTeclado;
Un saludo.