Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: adrit en 14 de Julio 2015, 17:19
-
Hola!!
EJERCICIO CU00666B
Crea una clase denominada ListaCantantesFamosos que al ser inicializada contenga un ArrayList con tres Strings que sean el nombre de cantantes famosos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y usando un for extendido muestre los cantantes en la lista por pantalla. Se debe pedir al usuario un nombre más de cantante famoso, y una vez introducido mostrar la lista actualizada usando un for extendido. Una vez mostrada la lista actualizada, se debe dar opción a elegir entre volver a introducir otro cantante o salir del programa (se podrán introducir tantos cantantes como se desee, para ello usa un bucle while que dé opción a elegir al usuario).
public class Test {
static ListaCantantesFamosos lista; //es estatico ya que lo vamos a inicializar y usar dentro del metodo main
public static void main (String[] args) {
lista = new ListaCantantesFamosos();
System.out.println("\nMostrando lista Actual\n");
lista.getListaCompleta();
cantanteOpcional();
}
static void cantanteOpcional() {
EntradaDeTeclado respuestaUsuario, ingresoCantante; //declaramos dos objetos de tipo EntradaDeTeclado
do {
System.out.println("\nDesea ingresar otro cantante? Y / N");
respuestaUsuario = new EntradaDeTeclado();
if (respuestaUsuario.getEntrada().toLowerCase().equals("y")) {
System.out.println("\nIngrese otro cantante");
ingresoCantante = new EntradaDeTeclado();
//agregando el cantante ingresado al objeto lista
lista.addCantante(ingresoCantante.getEntrada());
System.out.println("Cantante agregado satisfactoriamente\n");
System.out.println("Mostrando lista actualizada\n");
lista.getListaCompleta();
}else if (respuestaUsuario.getEntrada().toLowerCase().equals("n")) {
break; //cuando la respuesta es "n" rompemos el loop do-while
} else { //si respuesta distinta de "y" o "n" repreguntamos
System.out.println("Por favor, ingrese Y o N");
respuestaUsuario.setEntrada("y");
/*cambiamos el valor por "y" para que se cumple la condicion en el while siguiente
para ejecutar la sentencia del do nuevamente.
Para poder cambiar el valor de respuestaUsuario agregamos un metodo setEntrada en la
clase EntradaDeTeclado*/
}
}// fin de do
while (respuestaUsuario.getEntrada().toLowerCase().equals("y"));
System.out.println("\nMostrando lista final\n");
lista.getListaCompleta();
System.out.println("\nPrograma terminado");
}
}
Usé la misma clase ListaCantantesFamosos anterior y modicando el metodo getListaCompleta con el for each
import java.util.ArrayList;
public class ListaCantantesFamosos {
private ArrayList<String> listaCantantes;
//constructor que inicializa el objeto listaCantantes y agrega 3 cantantes(strings)
public ListaCantantesFamosos () {
listaCantantes = new ArrayList<String>();
listaCantantes.add("Bono"); listaCantantes.add("Freddie Mercury"); listaCantantes.add("Shakira");
}
//metodo para agregar otros strings
public void addCantante (String nombre) { listaCantantes.add(nombre); }
//metodo que devuelve todo el contenido del ArrayList listaCantantes
public void getListaCompleta () {
int i = 0;
for (String nombre : listaCantantes) {
System.out.println("Cantante "+(i+1)+" : "+nombre);
i++;
}
}
}
import java.util.Scanner;
public class EntradaDeTeclado {
private String entradaTeclado;
public EntradaDeTeclado () {
entradaTeclado="";
pedirEntrada(); //llamada al metodo interno
}
public void pedirEntrada () {
Scanner entradaEscaner = new Scanner (System.in);
entradaTeclado = entradaEscaner.nextLine (); }
public void setEntrada (String entradaTeclado) {
this.entradaTeclado=entradaTeclado;
}
public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
} //Cierre de la clase
Gracias!!
-
Hola adrit, en la clase ListaCantantesFamosos usas un índice en un for extendido.
public void getListaCompleta () {
int i = 0;
for (String nombre : listaCantantes) {
System.out.println("Cantante "+(i+1)+" : "+nombre);
i++;
}
}
En otros hilos del foro ya se ha comentado que si se usa un for de este tipo normalmente no se usan índices numéricos. En caso de usar índices numéricos se usa un for tradicional.
Otro detalle a comentar es
respuestaUsuario.getEntrada().toLowerCase().equals("y")
En lugar de esto puedes usar
respuestaUsuario.getEntrada().equalsIgnoreCase("y")
De este modo admites tanto y minúscula como Y mayúscula.
En la clase Test deberías mejorar el planteamiento del bucle para pedir datos al usuario. Normalmente no debemos usar break para salir de un bucle. Sería bueno que corrijas esto y lo reescribas sin usar break (es decir, la salida del bucle debería estar controlada desde la condici´no del bucle,, no usando un break). Puedes fijarte en ejemplos de otros compañeros en los foros, para ello busca la clave CU00666B en el buscador del foro. Por ejemplo puedes ver ejercicios resueltos como este https://www.aprenderaprogramar.com/foros/index.php?topic=2262
Saludos!
-
Cesar, agradezco mucho tu devolución!
Hice correcciones y me gustaría mostrarte como quedó el codigo
En ListaCantantesFamosos saqué el indice numérico ya que la consigna pide hacerlo con un for extendido
import java.util.ArrayList;
public class ListaCantantesFamosos {
private ArrayList<String> listaCantantes;
//constructor que inicializa el objeto listaCantantes y agrega 3 cantantes(strings)
public ListaCantantesFamosos () {
listaCantantes = new ArrayList<String>();
listaCantantes.add("Bono"); listaCantantes.add("Freddie Mercury"); listaCantantes.add("Shakira");
}
//metodo para agregar otros strings
public void addCantante (String nombre) { listaCantantes.add(nombre); }
//metodo que devuelve todo el contenido del ArrayList listaCantantes
public void getListaCompleta () {
for (String nombre : listaCantantes) {
System.out.println("Cantante : "+nombre);
}
}
}
El main modificado
public class Test {
static ListaCantantesFamosos lista; //es estatico ya que lo vamos a inicializar y usar dentro del metodo main
public static void main (String[] args) {
lista = new ListaCantantesFamosos();
System.out.println("\nMostrando lista Actual\n");
lista.getListaCompleta();
cantanteOpcional();
}
static void cantanteOpcional() {
EntradaDeTeclado respuestaUsuario, ingresoCantante; //declaramos dos objetos de tipo EntradaDeTeclado
do {
System.out.println("\nDesea ingresar otro cantante? Y / N");
respuestaUsuario = new EntradaDeTeclado();
if (respuestaUsuario.getEntrada().equalsIgnoreCase("y")) {
System.out.println("\nIngrese otro cantante");
ingresoCantante = new EntradaDeTeclado();
//agregando el cantante ingresado al objeto lista
lista.addCantante(ingresoCantante.getEntrada());
System.out.println("Cantante agregado satisfactoriamente\n");
System.out.println("Mostrando lista actualizada\n");
lista.getListaCompleta();
}else if (respuestaUsuario.getEntrada().equalsIgnoreCase("n")) {
//aca respuestaUsuario.getEntrada() es igual a "n" entonces se repite el do por la condicion del while.
//por lo tanto este if lo dejo en blanco
} else { //si respuesta distinta de "y" o "n" repreguntamos
System.out.println("Por favor, ingrese Y o N");
respuestaUsuario.setEntrada("y");
/*cambiamos el valor por "y" para que se cumple la condición en el while siguiente
para ejecutar la sentencia del do nuevamente.
Para poder cambiar el valor de respuestaUsuario agregamos un metodo setEntrada en la
clase EntradaDeTeclado*/
}
}// fin de do
while (respuestaUsuario.getEntrada().equalsIgnoreCase("y"));
System.out.println("\nMostrando lista final\n");
lista.getListaCompleta();
System.out.println("\nPrograma terminado");
}
}
Muchas gracias!
-
Ahora bastante mejor!
Todavía se puede mejorar ya que tienes un condicional else if que está vacío y que realmente no es necesario.
Queda más simple así:
static void cantanteOpcional() {
EntradaDeTeclado respuestaUsuario, ingresoCantante; //declaramos dos objetos de tipo EntradaDeTeclado
do {
System.out.println("\nDesea ingresar otro cantante? Y / N");
respuestaUsuario = new EntradaDeTeclado();
if (respuestaUsuario.getEntrada().equalsIgnoreCase("y")) {
System.out.println("\nIngrese otro cantante");
ingresoCantante = new EntradaDeTeclado();
//agregando el cantante ingresado al objeto lista
lista.addCantante(ingresoCantante.getEntrada());
System.out.println("Cantante agregado satisfactoriamente\n");
System.out.println("Mostrando lista actualizada\n");
lista.getListaCompleta();
}else if (respuestaUsuario.getEntrada().equalsIgnoreCase("n") == false) {
System.out.println("Por favor, ingrese Y o N");
respuestaUsuario.setEntrada("y");
}
}// fin de do
while (respuestaUsuario.getEntrada().equalsIgnoreCase("y"));
System.out.println("\nMostrando lista final\n");
lista.getListaCompleta();
System.out.println("\nPrograma terminado");
}
Aquí la lógica sería: si escribe y seguimos el primer if, si no ha escrito y y tampoco escribe n le pedimos que ingrese y o n
Saludos!
-
Excelente!
Muchas gracias!