Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: LuisM en 09 de Junio 2017, 00:00
-
Hola a todos !! Paso a dejar el código del ejercicio CU00667B del manual de programación Java con entorno de aprendizaje BlueJ. Desde ya muchas gracias.
Saludos
Luis
EJERCICIO
Crea una clase denominada ListaCantantesFamosos que disponga de un atributo ArrayList listaCantantesFamosos que contenga objetos de tipo CantanteFamoso. La clase debe tener un método que permita añadir objetos de tipo CantanteFamoso a la lista. Un objeto de tipo CantanteFamoso tendrá como atributos nombre (String) y discoConMasVentas (String), y los métodos para obtener y establecer los atributos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y añade manualmente dos objetos de tipo CantanteFamoso a la la lista. Usando iterator muestra los nombres de cada cantante y su disco con más ventas por pantalla. Se debe pedir al usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción a elegir entre volver a introducir los datos de otro cantante o salir del programa (se podrán introducir tantos datos de cantantes como se desee.
Clase Test (main)
import java.util.*;
// Aquí el test con el método main ejemplo aprenderaprogramar.com
public class Test {
public static void main (String [ ] args) {
String nombreCantante = "";
String nombreDisco="";
String respuesta="";
ListaCantantesFamosos lista = new ListaCantantesFamosos("Nombres introducidos por usuario");
EntradaDeTeclado entrada = new EntradaDeTeclado();
nombreCantante = "Madonna";
nombreDisco = "All I want is you";
lista.addLista(nombreCantante,nombreDisco);
nombreCantante = "Jorge Negrete";
nombreDisco = "Jalisco";
lista.addLista(nombreCantante,nombreDisco);
Iterator <CantanteFamoso> it=lista.iterator();
while(it.hasNext()){
CantanteFamoso itemLista;
itemLista=(CantanteFamoso)it.next(); // objeto de la lista que estamos viendo
nombreCantante = itemLista.getNombre();
nombreDisco = itemLista.getDisco();
System.out.println("Cantante :"+nombreCantante+" - Disco mas vendido: "+nombreDisco);
}
do {
System.out.println("Desea introducir los datos otro cantante (s/n)?");
entrada.pedirEntrada();
respuesta=entrada.getEntrada();
if (respuesta.equals("s")) {
System.out.println ("Por favor introduzca el nombre cantante:");
entrada.pedirEntrada();
nombreCantante=entrada.getEntrada();
System.out.println ("Por favor introduzca el nombre del disco:");
entrada.pedirEntrada();
nombreDisco=entrada.getEntrada();
lista.addLista(nombreCantante,nombreDisco);
Iterator <CantanteFamoso> it2=lista.iterator();// Agrega a la lista
while(it2.hasNext()){
CantanteFamoso itemLista;
itemLista=(CantanteFamoso)it2.next(); // objeto de la lista que estamos viendo
nombreCantante = itemLista.getNombre();
nombreDisco = itemLista.getDisco();
System.out.println("Cantante :"+nombreCantante+" - Disco mas vendido: "+nombreDisco);
}
} else if(respuesta.equals("n")) {break;} else {respuesta="s";}
}
while(respuesta.equals("s"));
}
} //Cierre del main
Clase ListaCantantesFamosos
//Ejemplo de uso ArrayList aprenderaprogramar.com
import java.util.*; //Los import deben ir siempre al principio antes de declarar la clase
//Esta clase representa una lista de nombres manejada con la clase ArrayList de Java
public class ListaCantantesFamosos {
private String nombreDeLaLista; //Establecemos un atributo nombre de la lista
private ArrayList<CantanteFamoso> listadenombres; //Declaramos un ArrayList que contiene objetos String
public ListaCantantesFamosos (String nombre) { //Constructor: crea una lista de nombres vacía
nombreDeLaLista = nombre;
listadenombres = new ArrayList<CantanteFamoso>(); //Creamos el objeto de tipo ArrayList
} //Cierre del constructor
public void addLista(String valor_nombre, String valor_disco) {
CantanteFamoso cantanteFamoso = new CantanteFamoso(valor_nombre, valor_disco);
listadenombres.add(cantanteFamoso);
} //Cierre del método
public int getTamanio () { return listadenombres.size(); } //Cierre del método
public Iterator<CantanteFamoso>iterator() { return listadenombres.iterator();}
public void removeNombre (int posicion) { //Método
if (posicion >= 0 && posicion < listadenombres.size() ) {
listadenombres.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
} //Cierre de la clase
Clase CantanteFamoso (el objeto de la lista anterior)
// Creación de la clase ListaCantantesFamosos.
public class CantanteFamoso {
private String cantante;
private String disco; // Hace alusión al disco mas vendido
public CantanteFamoso(){ // constructor 1 - sin ingreso de datos
cantante = "";
disco = "";
} // fin constructor 1
public CantanteFamoso(String nombreCantante,String discoCantante) { // constructor 2 - con entrada de datos nombre y disco
cantante = nombreCantante;
disco = discoCantante;
} // fin constructor 2
// metodos setters
public void setNombre(String nombreDelCantante) {
cantante = nombreDelCantante;
}
public void setDisco(String nombreDelDisco) {
disco = nombreDelDisco;
}
// metodos getters
public String getDisco() {
return disco;
}
public String getNombre() {
return cantante;
}
}// fin de la clase
Clase para ingresar nombre del cantante y nombre del disco. Tambien sirve para ingresar "s" o "n".
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
private int entradaNumero;
public EntradaDeTeclado () { //Constructor
entradaTeclado="";
entradaNumero=0;
// pedirEntrada(); //Esto es una llamada a un método interno. Al crear un objeto 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 void pedirNumero (){
Scanner entradaEscaner = new Scanner (System.in);
entradaNumero = entradaEscaner.nextInt ();
}
public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
public int getNumero() {return entradaNumero;}
public String getPrimeraPalabra () {
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
-
Hola Luis el ejercicio hace lo que se pedía
[Repito] Por favor, si creas temas en el foro, ponle un título adecuado siguiendo las indicaciones que se dan en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0
Cuando se trate de responder a un ejercicio, te recomiendo seguir lo que indica el ejercicio, por ejemplo en lugar de private String disco; usar private String discoConMasVentas; ya que es lo que indica el ejercicio. De este modo se puede valorar la corrección del ejercicio. En códigos que crees tú libremente (que también puedes subir al foro si lo deseas) es otra cosa.
Este método no lo veo correcto
public void addLista(String valor_nombre, String valor_disco) {
CantanteFamoso cantanteFamoso = new CantanteFamoso(valor_nombre, valor_disco);
listadenombres.add(cantanteFamoso);
} //Cierre del método
addLista significa añadir lista. Tú no estás añadiendo una lista, estás añadiendo un cantante, por tanto el nombre que describe lo que hace el método sería addCantante (que sigue el estándar de forma de nombrar métodos en Java); otras opciones serían addToList ó addCantanteALista pero con addCantante lo veo bien, mejor no complicar las cosas. El nombre addLista es confuso, si los nombres de clases, métodos, etc. son confusos los programas no serán de buena calidad.
En la clase con el main hay dos fragmentos casi iguales, en while(it.hasNext()) y while(it2.hasNext())
Cuando el código se repite es síntoma de un mal diseño. El código no debe repetirse, hay que evitar la "redundancia". Si necesitas hacer varias veces la misma cosa, crea un método e invócalo cada vez que lo necesites. De ese modo el código se escribe una vez, y no varias veces.
Otro detalle no adecuado, usar break para salir de un bucle en else if(respuesta.equals("n")) {break;} En general no debe usarse break para salir de un bucle, sólo cuando no puede establecerse la salida de forma natural a través de la condición del bucle.
¿Qué ocurre si borras else if(respuesta.equals("n")) {break;} else {respuesta="s";} ? Analízalo tú mismo y trata de tener claro el por qué ocurre eso
Saludos
-
"¿Qué ocurre si borras else if(respuesta.equals("n")) {break;} else {respuesta="s";} ? Analízalo tú mismo y trata de tener claro el por qué ocurre eso"
Funciona correctamente.
Ese código lo puse para validar que la salida sea por "n" y no con cualquier otra tecla. Sacando esa parte de código el mensaje debería ser "presiona "s" para agregar datos o cualquier otra tecla para salir"
Muchas gracias !!!
Saludos
Luis