Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: jasolis en 06 de Noviembre 2015, 22:47
-
Hola, mi respuesta al ejercicio CU00667B del tutorial Java desde cero
>>>>> Clase EntradaTeclado:
import java.util.Scanner;
public class EntradaTeclado{
//Campos o atributos
Scanner escaner;
String entrada;
//Constructor
public EntradaTeclado(){
escaner = new Scanner(System.in);
setEntrada(escaner.nextLine());
}
//Setters
public void setEntrada(String valor_entrada){entrada = valor_entrada;}
//Getters
public String getEntrada(){return entrada;}
}
>>>>> Clase CantanteFamoso:
public class CantanteFamoso{
//Campos o atributos
String nombre;
String discoConMasVentas;
//Constructor
public CantanteFamoso(){
nombre = "Desconocido";
discoConMasVentas = "Desconocido";
}
//Setters
public void setNombre(String valor_nombre){nombre = valor_nombre;}
public void setDiscoConMasVentas(String valor_discoConMasVentas){discoConMasVentas = valor_discoConMasVentas;}
//Getters
public String getNombre(){return nombre;}
public String getDiscoConMasVentas(){return discoConMasVentas;}
}//Cierre de la clase
>>>>> Clase ListaCantantesFamosos:
import java.util.ArrayList;
public class ListaCantantesFamosos{
//Campos o atributos
ArrayList<CantanteFamoso> listaCantantesFamosos;
//Constructor
public ListaCantantesFamosos(){
listaCantantesFamosos = new ArrayList<CantanteFamoso>();
}
//Método añadir objeto de tipo CantanteFamoso a la lista
public void addCantanteFamoso(CantanteFamoso valor_cantanteFamoso){
listaCantantesFamosos.add(valor_cantanteFamoso);
}
public CantanteFamoso getCantanteFamoso(int posicion){
return listaCantantesFamosos.get(posicion);
}
public ArrayList<CantanteFamoso> getListaCantantesFamosos(){return listaCantantesFamosos;}
}
>>>>> TestListaCantantesFamosos:
import java.util.Iterator;
public class TestListaCantantesFamosos{
public static void main(String[] args){
System.out.println("***** EMPEZAMOS EL PROGRAMA *****");
ListaCantantesFamosos listaCantantesFamosos = new ListaCantantesFamosos();
CantanteFamoso cantante = null;
EntradaTeclado entrada = null;
String respuesta = "y";
System.out.println("-Añadir dos cantantes famosos a la lista-");
for(int i = 0; i < 2; i++){
cantante = new CantanteFamoso();
System.out.println("Por favor introduce el nombre del cantante");
entrada = new EntradaTeclado();
cantante.setNombre(entrada.getEntrada());
System.out.println("Por favor introduce el disco con más ventas del cantante " + cantante.getNombre());
entrada = new EntradaTeclado();
cantante.setDiscoConMasVentas(entrada.getEntrada());
listaCantantesFamosos.addCantanteFamoso(cantante);
}
System.out.println("-Usando Iterator, mostrar el nombre de los cantantes ingresados y sus discos mas vendidos-");
Iterator<CantanteFamoso> it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
while(it.hasNext()){
CantanteFamoso tempCantante = it.next();
System.out.println("Nombre del cantante: " + tempCantante.getNombre());
System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
}
while(respuesta.equals("y")){
System.out.println("-Pedir al usuario un nuevo cantante-");
cantante = new CantanteFamoso();
System.out.println("Por favor introduce el nombre de otro cantante famoso");
entrada = new EntradaTeclado();
cantante.setNombre(entrada.getEntrada());
System.out.println("Por favor introduce el disco con mas ventas del cantante " + cantante.getNombre());
entrada = new EntradaTeclado();
cantante.setDiscoConMasVentas(entrada.getEntrada());
listaCantantesFamosos.addCantanteFamoso(cantante);
System.out.println("-Mostrar la lista actualizada usando Iterator-");
it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
while(it.hasNext()){
CantanteFamoso tempCantante = it.next();
System.out.println("Nombre del cantante: " + tempCantante.getNombre());
System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
}
System.out.println("Deseas introducir otro cantante? (Y/N)");
entrada = new EntradaTeclado();
respuesta = entrada.getEntrada().toLowerCase();
while( !(respuesta.equals("y")) && !(respuesta.equals("n")) ){
System.out.println("Respuesta no valida. Deseas introducir otro cantante? (Y/N)");
entrada = new EntradaTeclado();
respuesta = entrada.getEntrada().toLowerCase();
}
}
System.out.println("***** FIN DEL PROGRAMA *****");
}//Cierre del main
}//Cierre de la clase
-
Hola jasolis he revisado tu código y funciona correctamente realizando su cometido. Puedo señalarte un aspecto que aunque no sea un fallo podría ser mejorado. Te indico cómo podrías mejorarlo para que si tienes interés lo hagas (si quieres pega el código una vez hayas hecho los cambios y te comentaremos de nuevo).
Cuestión 1: en la clase EntradaTeclado para pedir una entrada de teclado y establecer el atributo entrada hemos de crear un objeto, ya que es la única forma de que se nos pida la entrada, el realizarse esa petición dentro del constructor.
Cuestión 2: en la clase TestListaCantantesFamosos lo anterior nos obliga a crear varios objetos EntradaTeclado y surge código repetitivo, por ejemplo:
for(int i = 0; i < 2; i++){
cantante = new CantanteFamoso();
System.out.println("Por favor introduce el nombre del cantante");
entrada = new EntradaTeclado();
cantante.setNombre(entrada.getEntrada());
System.out.println("Por favor introduce el disco con más ventas del cantante " + cantante.getNombre());
entrada = new EntradaTeclado();
cantante.setDiscoConMasVentas(entrada.getEntrada());
listaCantantesFamosos.addCantanteFamoso(cantante);
}
Se repite entrada = new EntradaTeclado(); aquí y en otros puntos...
Mejora del diseño que se podría implementar: en la clase EntradaTeclado crear un método que sirva para pedir la entrada de teclado (de esta forma, no estaría en el constructor, sino en un método).
En la clase TestListaCantantesFamosos crear un único objeto EntradaTeclado e irlo utilizando a través de sus métodos cada vez que sea necesario. De ese modo evitamos tener que repetir entrada = new EntradaTeclado(); en múltiples ocasiones.
Saludos
-
Hola Alex, gracias por tomarte el tiempo de revisar mi código, me han sido muy útiles tus observaciones. Aquí están las clases modificadas, espero haberlo hecho correctamente. Saludos!
>>>>> clase EntradaTeclado:
import java.util.Scanner;
public class EntradaTeclado{
//Campos o atributos
Scanner escaner;
String entrada;
//Constructor
public EntradaTeclado(){
//escaner = new Scanner(System.in);//Remueve código ineficiente
//setEntrada(escaner.nextLine());//Remueve código ineficiente
escaner = null;//Inicializamos el campo del objeto
entrada = "";//Inicializamos el campo del objeto
}
/***** Remueve código ineficiente
//Setters
public void setEntrada(String valor_entrada){entrada = valor_entrada;}
*/
//Nuevo método para pedir la entrada del teclado fuera del constructor
public void pedirEntrada(){
escaner = new Scanner(System.in);
entrada = escaner.nextLine();
}
//Getters
public String getEntrada(){return entrada;}
}
>>>>> clase TestListaCantantesFamosos:
import java.util.Iterator;
public class TestListaCantantesFamosos{
public static void main(String[] args){
System.out.println("***** EMPEZAMOS EL PROGRAMA *****");
ListaCantantesFamosos listaCantantesFamosos = new ListaCantantesFamosos();
CantanteFamoso cantante = null;
//EntradaTeclado entrada = null; //Remueve código ineficiente
EntradaTeclado entrada = new EntradaTeclado(); //Ahora usamos un solo objeto para pedir la entrada por teclado cada vez que se necesite
System.out.println("-Añadir dos cantantes famosos a la lista-");
for(int i = 0; i < 2; i++){
cantante = new CantanteFamoso();
System.out.println("Por favor introduce el nombre del cantante");
//entrada = new EntradaTeclado();//Remueve código ineficiente
entrada.pedirEntrada();//Pide entrada por teclato
cantante.setNombre(entrada.getEntrada());
System.out.println("Por favor introduce el disco con más ventas del cantante " + cantante.getNombre());
//entrada = new EntradaTeclado();//Remueve código ineficiente
entrada.pedirEntrada();//Pide entrada por teclato
cantante.setDiscoConMasVentas(entrada.getEntrada());
listaCantantesFamosos.addCantanteFamoso(cantante);
}
System.out.println("-Usando Iterator, mostrar el nombre de los cantantes ingresados y sus discos mas vendidos-");
Iterator<CantanteFamoso> it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
while(it.hasNext()){
CantanteFamoso tempCantante = it.next();
System.out.println("Nombre del cantante: " + tempCantante.getNombre());
System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
}
String respuesta = "";
do{
System.out.println("-Pedir al usuario un nuevo cantante-");
cantante = new CantanteFamoso();
System.out.println("Por favor introduce el nombre de otro cantante famoso");
//entrada = new EntradaTeclado();//Remueve código ineficiente
entrada.pedirEntrada();//Pide entrada por teclato
cantante.setNombre(entrada.getEntrada());
System.out.println("Por favor introduce el disco con mas ventas del cantante " + cantante.getNombre());
//entrada = new EntradaTeclado();//Remueve código ineficiente
entrada.pedirEntrada();//Pide entrada por teclato
cantante.setDiscoConMasVentas(entrada.getEntrada());
listaCantantesFamosos.addCantanteFamoso(cantante);
System.out.println("-Mostrar la lista actualizada usando Iterator-");
it = listaCantantesFamosos.getListaCantantesFamosos().iterator();
while(it.hasNext()){
CantanteFamoso tempCantante = it.next();
System.out.println("Nombre del cantante: " + tempCantante.getNombre());
System.out.println("Disco con mas ventas: " + tempCantante.getDiscoConMasVentas());
}
System.out.println("Deseas introducir otro cantante? (Y/N)");
//entrada = new EntradaTeclado();//Remueve código ineficiente
entrada.pedirEntrada();//Pide entrada por teclato
respuesta = entrada.getEntrada().toLowerCase();
while( !(respuesta.equals("y")) && !(respuesta.equals("n")) ){
System.out.println("Respuesta no valida. Deseas introducir otro cantante? (Y/N)");
//entrada = new EntradaTeclado();//Remueve código ineficiente
entrada.pedirEntrada();//Pide entrada por teclato
respuesta = entrada.getEntrada().toLowerCase();
}
}while(respuesta.equals("y"));
System.out.println("***** FIN DEL PROGRAMA *****");
}//Cierre del main
}//Cierre de la clase
-
Hola Alex, me he dado cuenta que el código que modifiqué al final está haciendo algo similar que al principio dado que en cada llamada al método <EntradaTeclado>.pedirEntradad() se crea un nuevo objeto de tipo Scanner...
He modificado una vez más la clase EntradaTeclado y ahora está definida de esta manera:
>>>>> clase EntradaTeclado:
import java.util.Scanner;
public class EntradaTeclado{
//Campos o atributos
Scanner escaner;
String entrada;
//Constructor
public EntradaTeclado(){
escaner = new Scanner(System.in);
entrada = "";
}
//Setter
public void pedirEntrada(){
entrada = escaner.nextLine();
}
//Getters
public String getEntrada(){return entrada;}
}
Saludos!
-
Hola, ahora lo veo mejor. Te sugiero que compares tu solución con la solución dada en https://www.aprenderaprogramar.com/foros/index.php?topic=2889.0 ahí podrás ver algunas cosas interesantes
Saludos
-
Muchas gracias Alex, tus comentarios me son muy útiles. Voy a echarle un ojo a la solución que mencionas para afinar detalles.
Saludos!