Autor Tema: CU00667B - Ejercicio curso Java - Iterator sobre ArrayList de String  (Leído 3862 veces)

xBag

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=633:tipo-iterator-api-java-ejemplo-error-javautilconcurrent-modificationexception-resumen-bucles-cu00667b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Saludos, hice lo que pude me esforcé mucho, estoy aquí para que me digan que es lo que puedo mejorar de mi código. Utilicé varias clases. Gracias de antemano!
CLASE PARA RECIBIR DATOS POR TECLADO
Código: [Seleccionar]
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
public EntradaDeTeclado () { //Constructor
entradaTeclado="";
pedirEntrada(); //Esto es una llamada a un método interno. Al crear un objeto automáticamente 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 String getEntrada () { return entradaTeclado; }
 //Cierre del método getEntrada
public String getPrimeraPalabra () {
/*IMPORTANTÍSIMO: EN JAVA LOS OBJETOS NO SE PUEDEN COMPARAR USANDO == POR ESO ESTO NO FUNCIONARÁ
if (entradaTeclado.substring(0,1).==("j")) {
System.out.println ("Hemos detectado una j");
} else { System.out.println ("Mira esto:" + entradaTeclado.substring(0,1) ); }*/
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


CLASE QUE TENDRA LA LISTA DE CANTANTEFAMOSO

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;
public class ListaDeCantantesFamosos
{
ArrayList<CantanteFamoso> listaCantantesFamosos;
public ListaDeCantantesFamosos(){listaCantantesFamosos = new ArrayList <CantanteFamoso>();}
public void nuevoCantante(CantanteFamoso cantante){
listaCantantesFamosos.add(cantante);
}
public void mostrarTodos(){
Iterator<CantanteFamoso> it = listaCantantesFamosos.iterator();   
CantanteFamoso tmpCant;
while (it.hasNext()){tmpCant = it.next();
System.out.println("Cantante: " + tmpCant.getNombre() + " con su disco " + tmpCant.getDisco() + " el más vendido");}
}
}

CLASE DE CANTANTES FAMOSOS

Código: [Seleccionar]
public class CantanteFamoso {
String nombre="";
String discoConMasVentas="";


public CantanteFamoso(String nombre, String discoConMasVentas){
this.nombre=nombre;
this.discoConMasVentas=discoConMasVentas;

}
public void setNombre(String Nombre){this.nombre=nombre;}
public void setDiscoConMasVentas(String discoConMasVentas){this.discoConMasVentas=discoConMasVentas;}

public String getNombre(){return nombre;}
public String getDisco(){return discoConMasVentas;}
 

}

CLASE CON MÉTODO MAIN

Código: [Seleccionar]
public class Test2 {
public static void main (String [] args){
ListaDeCantantesFamosos Lista = new ListaDeCantantesFamosos();
CantanteFamoso cantante1 = new CantanteFamoso("Romeo", "The last");
CantanteFamoso cantante2 = new CantanteFamoso("Juan Luis Guerra", "Abejas");
Lista.nuevoCantante(cantante1);
Lista.nuevoCantante(cantante2);
Lista.mostrarTodos();
System.out.println("Introduzca el nombre de un nuevo cantante");
EntradaDeTeclado entrada = new EntradaDeTeclado();
System.out.println("Introdzuca el disco más vendido de dicho cantante");
EntradaDeTeclado entrada2 = new EntradaDeTeclado();
CantanteFamoso cantanteIngresado = new CantanteFamoso(entrada.getEntrada(), entrada2.getEntrada());
Lista.nuevoCantante(cantanteIngresado);
Lista.mostrarTodos();
System.out.println("\nQuiere continuar?(si o no): ");
EntradaDeTeclado respuesta = new EntradaDeTeclado();
if (respuesta.getEntrada().equalsIgnoreCase("no")){System.exit(1);}
while (!respuesta.getEntrada().equalsIgnoreCase("si") || !respuesta.getEntrada().equalsIgnoreCase("no")){
    if(respuesta.getEntrada().equalsIgnoreCase("si") || respuesta.getEntrada().equalsIgnoreCase("no") ) {break;}
    System.out.println("\nEscriba si o no por favor.");
    respuesta.pedirEntrada();
 }
while(respuesta.getEntrada().equalsIgnoreCase("si")) {
System.out.println("Introduzca el nombre de un nuevo cantante");
EntradaDeTeclado nuevoCantante = new EntradaDeTeclado();
System.out.println("Introdzuca el disco más vendido de dicho cantante");
EntradaDeTeclado nuevoDisco = new EntradaDeTeclado();
CantanteFamoso otroCantante = new CantanteFamoso(nuevoCantante.getEntrada(), nuevoDisco.getEntrada());
Lista.nuevoCantante(otroCantante);
Lista.mostrarTodos();
System.out.println("\nQuiere continuar? (si o no): ");
respuesta.pedirEntrada();
while (!respuesta.getEntrada().equalsIgnoreCase("si") || !respuesta.getEntrada().equalsIgnoreCase("no")){
    if(respuesta.getEntrada().equalsIgnoreCase("si") || respuesta.getEntrada().equalsIgnoreCase("no") ) {break;}
     System.out.println("\nEscriba si o no por favor.");
    respuesta.pedirEntrada();
 
}
}



}
}


Mil disculpas si está un poco tedioso de leer lo arreglé lo más que pude! Saludos!
« Última modificación: 24 de Diciembre 2014, 08:34 por Ogramar »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:CU00667B - EJERCICIO - Iterator
« Respuesta #1 en: 23 de Diciembre 2014, 19:42 »
Hola xBag

Tu ejercicio está perfecto.
Además de las clases con todos sus métodos, el proyecto cumple todos los requisitos solicitados. Me refiero a:
1º El programa introduce al ejecutarse dos cantantes en la lista y los muestra.
2º Pide los datos para añadir un nuevo cantente y muestra la lista actualizada
3º Y a partir de ahora preguntará si se quieren añadir más cantantes y repite el bucle.

Bien.

Además quiero comentarte algo sobre tu código.

Has decidido que para añadir un nuevo cantante se debe introducirse la palabra 'si' con todas sus letras, igualmente para salir sin añadir más cantantes debe introducirse la palabra 'no' con todas sus letras. Solo son dos letras, mejor que introducir 'si, por favor' o 'no, gracias'.

Para un caso como este, en que las dos opciones (si y no) se excluyen la una a la otra, bastaría con proporcionar el código para una opción (si no se escoge esa opción, por exclusión se toma la otra)
---
Luego repites varias líneas de código, por ejemplo:

Código: [Seleccionar]
        while (!respuesta.getEntrada().equalsIgnoreCase("si") || !respuesta.getEntrada().equalsIgnoreCase("no")){
            if(respuesta.getEntrada().equalsIgnoreCase("si") || respuesta.getEntrada().equalsIgnoreCase("no") ) {break;}
            System.out.println("\nEscriba si o no por favor.");
            respuesta.pedirEntrada();

Aunque el código es operativo, le quita elegancia y eficiencia al programa el hecho de repetir el mismo código.
---
Siguendo las líneas de tu código, utilizas dos formas de salir del código que son a mi modo de ver bruscas/rompedoras
La primera: System.exit(1)
Esta instrucción cierra el programa en el acto. Por decirlo de otra manera, sales de casa 'desapareciendo, esfumándote en el aire' como si viajases a otra dimensión. No das oportunidad a despedirse de la familia o los amigos que estén en casa.
La segunda: break (dentro del while)
Con esta sentencia poniendo otro símil, sales de la habitación rompiendo la pared sin usar la puerta.

Es cierto que estas formas de salir, son rápidas y efectivas, pero para mí no son elegantes.

A continuación te muestro una versión modificada de tu clase Test2 para que veas otra forma que gestionar un bucle while.
Algunas líneas de tu código las he convertido en comentario y he añadido las mías.

Código: [Seleccionar]
public class Test2B {
    public static void main (String [] args){
        ListaDeCantantesFamosos Lista = new ListaDeCantantesFamosos();
        CantanteFamoso cantante1 = new CantanteFamoso("Romeo", "The last");
        CantanteFamoso cantante2 = new CantanteFamoso("Juan Luis Guerra", "Abejas");
        Lista.nuevoCantante(cantante1);
        Lista.nuevoCantante(cantante2);
        System.out.println ("\f\tLa lista inicialmente contiene los siguientes datos:");
        Lista.mostrarTodos();
        //         System.out.println("\fIntroduzca el nombre de un nuevo cantante");
        EntradaDeTeclado entrada; // = new EntradaDeTeclado();
        //         System.out.println("Introdzuca el disco más vendido de dicho cantante");
        //         EntradaDeTeclado entrada2 = new EntradaDeTeclado();
        //         CantanteFamoso cantanteIngresado = new CantanteFamoso(entrada.getEntrada(), entrada2.getEntrada());
        //         Lista.nuevoCantante(cantanteIngresado);
        //         Lista.mostrarTodos();
        //         System.out.println("\nQuiere continuar?(si o no): ");
        //         EntradaDeTeclado respuesta = new EntradaDeTeclado();
        //         if (respuesta.getEntrada().equalsIgnoreCase("no")){System.exit(1);}
        //         while (!respuesta.getEntrada().equalsIgnoreCase("si") || !respuesta.getEntrada().equalsIgnoreCase("no")){
        //             if(respuesta.getEntrada().equalsIgnoreCase("si") || respuesta.getEntrada().equalsIgnoreCase("no") ) {break;}
        //             System.out.println("\nEscriba si o no por favor.");
        //             respuesta.pedirEntrada();
        //         }
        //         while(respuesta.getEntrada().equalsIgnoreCase("si")) {
        //             System.out.println("Introduzca el nombre de un nuevo cantante");
        //             EntradaDeTeclado nuevoCantante = new EntradaDeTeclado();
        //             System.out.println("Introdzuca el disco más vendido de dicho cantante");
        //             EntradaDeTeclado nuevoDisco = new EntradaDeTeclado();
        //             CantanteFamoso otroCantante = new CantanteFamoso(nuevoCantante.getEntrada(), nuevoDisco.getEntrada());
        //             Lista.nuevoCantante(otroCantante);
        //             Lista.mostrarTodos();
        //             System.out.println("\nQuiere continuar? (si o no): ");
        //             respuesta.pedirEntrada();
        //             while (!respuesta.getEntrada().equalsIgnoreCase("si") || !respuesta.getEntrada().equalsIgnoreCase("no")){
        //                 if(respuesta.getEntrada().equalsIgnoreCase("si") || respuesta.getEntrada().equalsIgnoreCase("no") ) {break;}
        //                 System.out.println("\nEscriba si o no por favor.");
        //                 respuesta.pedirEntrada();
        //
        //             }
        //         }
        boolean cantanteNuevo = true;
        String nuevoCantante = "", nuevoDisco = "",lecturaTeclado = "";
        do {
            System.out.println("\n\tPor favor, introduzca los datos de otro cantante.");
            // Toma el nuevo nombre
            System.out.print("           ¿Nombre?: ");
            entrada = new EntradaDeTeclado();
            nuevoCantante = entrada.getEntrada();
            // Toma el nuevo disco
            System.out.print("¿Disco mas vendido?: ");
            entrada = new EntradaDeTeclado();
            nuevoDisco = entrada.getEntrada();
            // Crea y añade el nuevo cantante
            cantante2 = new CantanteFamoso(nuevoCantante,nuevoDisco);
            Lista.nuevoCantante(cantante2);
            System.out.println ("\n\tLa lista actualizada contiene los siguientes datos:");
            Lista.mostrarTodos();
            // Decide si continúa
            System.out.print("\nQuiere continuar?. Pulse (S) para si, cualquier otra tecla para no: ");
            entrada = new EntradaDeTeclado();
            lecturaTeclado = entrada.getEntrada();
            if (lecturaTeclado.length() == 0) { cantanteNuevo = false;         // Se ha pulsado INTRO solamente. Salimos
            } else if (lecturaTeclado.substring(0,1).equalsIgnoreCase("s")) {  // Se pedirá otro cantante
            } else {                            cantanteNuevo = false;         // Se ha pulsado cualquier otra cosa. Salimos
            } // fin del if
        } while (cantanteNuevo);
        System.out.println ("\t*** Finalizada la gestion de cantantes ***");
    }
}

Saludos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".