Muy buenas tardes!
Primero que nada, muchas gracias a todas las personas y moderadores que tuvieron la paciencia para corregir mis códigos y enseñarme muchísimas cosas nuevas sobre Java, créanme que ahora soy totalmente distinto de que cuando entre a esta pagina por primera vez. Vengo a mostrar en esta tarde mi ultimo código de java (temporalmente, claro
) que estaba pendiente... algo que empezó como una metida de pata y propuse remediarlo mas adelante..!
Les mostrare mi versión final de DiscMan, las cosas nuevas que verán ahora son:
1. Cada disco (o objeto), tendrá un
ID especifico que lo identifique, así es, se trata de un
atributo nuevo de la clase
DiscoMusical.
2. 3 métodos nuevos en la clase DiscoMusical.
3. Experimente con algo que no conocia antes, el
System.exit(0); . . .
Lo que mas me dejo satisfecho ahora, es que ya no necesito repetir código para cada objeto. . . puedo tener 25 objetos, y realizar lo que yo deseo sin repeticiones como códigos anteriores...
Este era el antiguo:
switch(elige){
case 1:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 1!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco1.setNombreDisco(); Disco1.setAutor(); Disco1.setFormato(); Disco1.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco1.getNombreDisco());
System.out.println("Nombre del autor: " + Disco1.getAutor());
System.out.println("Nombre del formato: " + Disco1.getFormato());
System.out.println("Canciones: ");
Disco1.getCanciones();}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
case 2:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 2!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco2.setNombreDisco(); Disco2.setAutor(); Disco2.setFormato(); Disco2.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco2.getNombreDisco());
System.out.println("Nombre del autor: " + Disco2.getAutor());
System.out.println("Nombre del formato: " + Disco2.getFormato());
System.out.println("Canciones: ");
Disco2.getCanciones();}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
case 3:
System.out.println("--------------------------------------------");
System.out.println("Has elegido el disco 3!: ");
MenuOperaciones();
if(opcion == 'A'||opcion == 'a'){Disco3.setNombreDisco(); Disco3.setAutor(); Disco3.setFormato(); Disco3.setCanciones();}
else if(opcion == 'B'||opcion == 'b'){
System.out.println("Nombre del disco: " + Disco3.getNombreDisco());
System.out.println("Nombre del autor: " + Disco3.getAutor());
System.out.println("Nombre del formato: " + Disco3.getFormato());
System.out.println("Canciones: ");
Disco3.getCanciones();
}
else if(opcion == 'C'||opcion == 'c'){ System.out.println("Saliendo... "); sal1 = true;}
else
System.out.println("Opcion desconocida. Intente de nuevo.");
System.out.println(" ");
System.out.println("--------------------------------------------");
break;
default:
System.out.println("No se reconoce la opcion insertada. Intente de nuevo.");
System.out.println(" ");
break;
}
Bueno, aquí las clases del programa:
Clase Lectores: No cambio absolutamente nada.
package Discos;
import java.util.Scanner;
public class Lectores {
public Lectores(){}
public String LeerCadena(){
Scanner in = new Scanner(System.in);
return in.nextLine();
}
public Double LecturaDecimal(){
Scanner in = new Scanner(System.in);
return in.nextDouble();
}
public int LecturaEntero(){
Scanner in = new Scanner(System.in);
return in.nextInt();
}
public char LecturaChar(){
Scanner in = new Scanner(System.in);
return in.next().charAt(0);
}
}
Clase DiscoMusical: Se les agrego atributo ID_DISCO, el metodo equals, las funciones redondear y toString.
package Discos;
public class DiscoMusical{
private String nombreDisco, autor, formato, nombreCancion[]= new String[19], ID_DISCO;
private double duracion, duracionCancion[] = new double[19];
private int numeroCanciones;
public DiscoMusical(){
nombreDisco = "";
autor = "";
formato = "";
duracion = 0;
ID_DISCO = "";
numeroCanciones = 0;
nombreCancion = new String[]{"","","","","","","","","","","","","","","","","","","",""};
duracionCancion = new double[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
}
public void setNombreDisco(){
System.out.println("--------------------------------------------");
Lectores leer = new Lectores();
System.out.println("Ingrese el nombre del disco: ");
nombreDisco = leer.LeerCadena();
}
public void setAutor(){
Lectores leer = new Lectores();
System.out.println("Ingrese el nombre del autor de este disco: ");
autor = leer.LeerCadena();
}
public void setFormato(){
Lectores leer = new Lectores();
System.out.println("Ingrese el formato del disco: ");
formato = leer.LeerCadena();
}
public void setID_Disco(){
Lectores leer = new Lectores();
System.out.println("Ingrese el ID del disco: ");
ID_DISCO = leer.LeerCadena();
}
public void setCanciones(){
Lectores leer = new Lectores();
do{
System.out.println("¿Cuantas canciones son?: ");
numeroCanciones = leer.LecturaEntero();
if(numeroCanciones > 20){System.out.println("Solo se pueden ingresar hasta 20 temas musicales. \nIntente de nuevo.");
System.out.println(" ");
}
}while(numeroCanciones > 20);
for (int i = 0, j = 1; i < numeroCanciones; i++, j++){
System.out.println("Ingrese el nombre de la cancion numero " + j + ": ");
nombreCancion[i] = leer.LeerCadena();
System.out.println("Ingrese la duracion de la cancion numero " + j + ": ");
duracionCancion[i] = leer.LecturaDecimal();
duracion = duracion + duracionCancion[i];
}
System.out.println("Datos Listos!.");
System.out.println("--------------------------------------------");
}
public boolean Equals(Object obj){
if(obj instanceof DiscoMusical){
DiscoMusical temp = (DiscoMusical)obj;
if(this.ID_DISCO.equals(temp.ID_DISCO)) return true;
else return false;
}
else return false;
}
public String getNombreDisco(){return nombreDisco;}
public String getAutor(){return autor;}
public String getFormato(){return formato;}
public String getID_Disco(){return ID_DISCO;}
public double Redondear(double numero,int digitos){
int cifras=(int) Math.pow(10,digitos);
return Math.rint(numero*cifras)/cifras;
}
public void getCanciones(){
System.out.println("\nCanciones del disco: ");
for (int i = 0, j = 1; i < numeroCanciones; i++, j++){
System.out.println(j + ". " + nombreCancion[i] + " (Duracion: " + Redondear(duracionCancion[i],2) + ").");
}
System.out.println("*************************************************************************");
System.out.println("Duracion total del disco: " + Redondear(duracion,2));
System.out.println("-------------------------------------------------------------------------");
}
public String toString(){
return "ID del disco: ".concat(ID_DISCO).concat("\nNombre del disco: ").concat(nombreDisco).concat("\nAutor: ").concat(autor).concat("\nFormato: ").concat(formato);
}
}
Clase Menú: El único que recibió un cambio drástico...
package Discos;
import java.util.Iterator;
import java.util.ArrayList;
public class Menu {
Lectores leer = new Lectores();
DiscoMusical Disco1 = new DiscoMusical();
DiscoMusical Disco2 = new DiscoMusical();
DiscoMusical Disco3 = new DiscoMusical();
ArrayList <DiscoMusical> listaDisco = new ArrayList <>();
int elige; String opcion; boolean ingresoInicial = false;
public void MenuPrincipal(){
listaDisco.add(Disco1); listaDisco.add(Disco2); listaDisco.add(Disco3);
while(true){
System.out.println("Bienvenido a la ultima version de DISCMAN!!\nEscriba Si continuar, de lo contrario, escriba Salir.");
opcion = leer.LeerCadena();
if(opcion.equalsIgnoreCase("Si")){
if(ingresoInicial == false){
int num = 1, cont = 0;
System.out.println("Para continuar, se necesita ingresar el ID del disco: ");
for(DiscoMusical aux1: listaDisco){
System.out.println("Disco numero " + num++ + ":");
do{
aux1.setID_Disco(); cont = 0;
for(int i =0; i < listaDisco.size(); i++){
if(aux1.Equals(listaDisco.get(i))){cont++;}}
if(cont > 1) System.out.println("Ha ingresado un ID repetido, ingrese otro diferente.");
}while(cont != 1);}
}
ingresoInicial = true;
MenuOperaciones();
}
else if(opcion.equalsIgnoreCase("Salir")){ System.out.println("Hasta luego!"); System.exit(0);}
else System.out.println("Caracter desconocido, intente de nuevo.");
}}
public void MenuOperaciones(){
while(opcion.equalsIgnoreCase("D") == false){
System.out.println("\n¿Que accion deseas ejecutar?:");
System.out.println("A)Ingresar datos a un disco.\nB)Imprimir datos de un disco.\nC)Imprimir todos los datos de los discos.\nD)Salir de este menu.");
opcion = leer.LeerCadena();
switch(opcion){
case "a":
case "A": boolean detectado = false;
System.out.println("Escriba el ID del disco al que se le va a ingresar datos: ");
while(detectado != true){
opcion = leer.LeerCadena();
for(int i = 0; i<listaDisco.size(); i++){
if(listaDisco.get(i).getID_Disco().equals(opcion)){
listaDisco.get(i).setNombreDisco(); listaDisco.get(i).setAutor(); listaDisco.get(i).setFormato(); listaDisco.get(i).setCanciones();
detectado = true;
}
}if(detectado == false){System.out.print("No se ha encontrado el ID ingresado, intente de nuevo: ");}}
System.out.println();
break;
case "b":
case "B": detectado = false;
System.out.println("Escriba el ID del disco para mostrar sus datos: ");
while(detectado != true){
opcion = leer.LeerCadena();
for(int i = 0; i<listaDisco.size(); i++){
if(listaDisco.get(i).getID_Disco().equals(opcion)){
System.out.println(listaDisco.get(i).toString());
listaDisco.get(i).getCanciones(); detectado = true;
}
}if(detectado == false){System.out.print("No se ha encontrado el ID ingresado, intente de nuevo: ");}}
System.out.println();
break;
case "c":
case "C":
Iterator <DiscoMusical> recorre = listaDisco.iterator();
while(recorre.hasNext()){
DiscoMusical temp = recorre.next();
System.out.println(temp.toString()); temp.getCanciones();
System.out.println();
}
break;
case "d":
case "D": System.out.println("Saliendo . . . \n"); MenuPrincipal(); break;
default: System.out.println("Opcion desconocida."); break;
}
}
}
}
Para el menú como se ve, ahora cada acción que quiera realizar, tengo que escribir el ID del disco que quiero modificar. Con el método equals evito la repetición de
ID's en el programa y ahorrarme un crash:
do{
aux1.setID_Disco(); cont = 0;
for(int i =0; i < listaDisco.size(); i++){
if(aux1.Equals(listaDisco.get(i))){cont++;}}
if(cont > 1) System.out.println("Ha ingresado un ID repetido, ingrese otro diferente.");
}while(cont != 1);}
Esta parte compara cada objeto con otro con un for, obviamente conseguirá un ID igual porque llegara un momento que va a comparar con el mismo objeto, mi solución para eso fue colocarle un contador que cuente las veces que los ID fueron iguales. Si el contador conto 2 veces una repetición, el programa avisara que hay un ID repetido... y como la condición del while sigue cumpliéndose (cont es distinto a 1..), retornara de nuevo al inicio (contador vuelve a ser igual a 0) y el usuario tendra que ingresar otro ID.
Los redondeos ahora se valen, puedo redondear ahora con 2 cifras, el metodo toString() ahora se incorpora para imprimir los datos de cada objeto!
Ya lo demás funciona exactamente igual como antes, publico una prueba rápida en breve!