Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: akira en 04 de Enero 2016, 06:16
-
Bueno, aquí esta mi solución al ejercicio CU00667B del curso de java:
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantantes
{
// Variables de instancia / atributos / campos
private ArrayList<CantanteFamoso> listaCantantes;
private String nombre;
/**
* Constructor for objects of class ListaCantantes
*/
public ListaCantantes(String nombre)
{
this.nombre = nombre;
listaCantantes = new ArrayList<CantanteFamoso>();
}
/**
* Métodos
*/
public void addCantante(CantanteFamoso objeto)
{
listaCantantes.add(objeto);
}
public void copiaValores(){
Iterator<CantanteFamoso> copiaLista = listaCantantes.iterator();
int indice = 0;
while(copiaLista.hasNext()){
CantanteFamoso cantante = copiaLista.next();
System.out.println(indice + ") Cantante: " + cantante.getNombre() + " Disco con mas ventas: "
+ cantante.getDisco());
indice +=1;
}
}
public void valoresReales(){
int indice = 0;
for(CantanteFamoso cantante: listaCantantes){
System.out.println(indice + ")" + cantante.getNombre());
indice ++;
}
}
}
import java.util.Scanner;
public class CantanteFamoso
{
// variables de instancia / atributos / campos
private String nombre;
private String disco;
/**
* Constructor
*/
public CantanteFamoso()
{
setNombre();
setDisco();
}
/**
* Métodos
*/
public void setNombre(){
System.out.println("Ingrese nombre");
Scanner entrada = new Scanner(System.in);
nombre = entrada.nextLine();
}
public void setDisco(){
System.out.println("Ingrese Disco");
Scanner entrada = new Scanner(System.in);
disco = entrada.nextLine();
}
public String getNombre(){return nombre;}
public String getDisco(){return disco;}
}
import java.util.Scanner;
public class testIterator
{
public static void main (String[] args){
CantanteFamoso cantante1 = new CantanteFamoso();
CantanteFamoso cantante2 = new CantanteFamoso();
ListaCantantes lista = new ListaCantantes("cantantes Famosos");
lista.addCantante(cantante1);
lista.addCantante(cantante2);
lista.copiaValores();
CantanteFamoso cantante3 = new CantanteFamoso();
lista.addCantante(cantante3);
lista.copiaValores();
boolean opcion = true;
Scanner entrada = new Scanner(System.in);
do{
System.out.println("Desea ingresar mas cantantes S/N");
String valorEntrada = entrada.nextLine();
if(valorEntrada.equalsIgnoreCase("s")){
CantanteFamoso cantante = new CantanteFamoso();
lista.addCantante(cantante);
lista.copiaValores();
}else if(valorEntrada.equalsIgnoreCase("n")){
break;
}else{
boolean error = true;
while(error == true){
System.out.println("Entrada no valida");
System.out.println("Desea ingresar mas cantantes S/N");
valorEntrada = entrada.nextLine();
if(valorEntrada.equalsIgnoreCase("n")){
error = false;
opcion = false;
}else if(valorEntrada.equalsIgnoreCase("s")){
error = false;
CantanteFamoso cantante = new CantanteFamoso();
lista.addCantante(cantante);
lista.copiaValores();
}//CIerre if
}//Cierre while
}//Cierre if
}while(opcion == true);
System.out.println("Fin de la ejecucion");
}//Cierre main
}//Cierre clase
aunque la verdadera razon de comentar aqui en el foro es que tengo una duda en esta parte:
CantanteFamoso cantante = new CantanteFamoso();
en entradas anteriores explicaban que a la hora de crear objetos se crea tanto el objeto como una variable que hace referencia a la direccion de memoria donde se almacena el objeto y es atraves de esa variable que podemos acceder a los metodos de ese objeto (si no entendi mal).
Entonces mi duda es que basicamente si encerramos ese codigo en un bucle y por ejemplo se ejecuta 5 veces, se crearian 5 objetos pero 1 sola variable referenciadora por lo que solo podria acceder al ultimo objeto que se creo (o por lo menos eso es lo que noto, no se si yo este equivocado) si por ejemplo yo escribiera:
cantante.getNombre();
obtendría el valor pero del ultimo objeto y los otros 4 quedaron inaccesibles. Entonces ¿como haría para crear mediante un bucle con una sola linea de codigo tanto el objeto como su correspondiente variable sin hacer esto?:
CantanteFamoso cantante1 = new CantanteFamoso();
CantanteFamoso cantante2 = new CantanteFamoso();
CantanteFamoso cantante3 = new CantanteFamoso();
CantanteFamoso cantante4 = new CantanteFamoso();
CantanteFamoso cantante5 = new CantanteFamoso();
yo deduzco que si esos objetos se almacenan en una lista o algo asi, se podría acceder a ellos recorriendo esa lista (ya sea con el for each o con Iterator) pero si yo quisiera acceder directamente al objeto quedan inaccesibles.
-
Hola akira, para la pregunta que haces
Entonces mi duda es que basicamente si encerramos ese codigo en un bucle y por ejemplo se ejecuta 5 veces, se crearian 5 objetos pero 1 sola variable referenciadora por lo que solo podria acceder al ultimo objeto que se creó
Es como tú dices, sólo podrías acceder al último objeto y los demás quedarían inaccesibles.
Para poder acceder tendrías que ir almacenando cada objeto creado en una colección, lista o array (de modo que cada objeto tendrá un índice). Luego recorriendo los elementos de esa colección, lista o array podrás acceder a cada uno de los objetos creados.
He probado tu código y funciona, aunque quiero señalarte algunas cosas.
En la clase ListaCantantes no se entiende bien para qué tienes un método copiaValores() y otro método valoresReales(). Los nombres de estos métodos no son adecuados porque no son descriptivos de lo que hace el método. El nombre de un método debe servir para saber qué es lo que hace.
En la clase testIterator tienes una salida de bucle planteada con un break:
else if(valorEntrada.equalsIgnoreCase("n")){
break;
}
En general se considera no aconsejable usar un break para forzar la salida de un bucle y que es preferible que la salida del bucle se produzca de forma natural usando la propia condición del bucle.
Puedes ver este ejercicio resuelto y fijarte en cómo hacerlo: https://www.aprenderaprogramar.com/foros/index.php?topic=2889.0
Saludos