Autor Tema: Ejercicio! entrega CU00667B ArrayList de objetos java  (Leído 3512 veces)

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Ejercicio! entrega CU00667B ArrayList de objetos java
« en: 30 de Julio 2014, 00:55 »
 :)
public class TesListaCantantesFamosos
Código: [Seleccionar]
import java.util.*;
public class TesListaCantantesFamosos
{
  private static ListaCantantesFamosos lista;
  public TesListaCantantesFamosos()
  {

  }
   
  public static void main(String []args)
  {
     System.out.println(" Hola!\nAyudanos a crear nuestra lista de cantantes famosos\nLa lista inicial contiene los siguientes datos:\n");
     lista = new ListaCantantesFamosos("Madonna", "All I want is you");
     lista.addObjetoCantante("Jorge Negrete", "Jalisco");
     lista.verLaListaCantantesFamososDetallada();
     System.out.println("\nPor favor agrega otro cantante.\n");
     lista.addObjetoCantante(entradaNombre(), entradaDiscoConMasVentas());
     mensajeNotificador();
     lista.verLaListaCantantesFamososDetallada();
     System.out.println("\n¿Deseas introducir los datos de otro cantante (s/n)?");
     String volver = "";
     volver = entrada();
    while(volver.equals("s") || volver.equals("S"))
    {
         System.out.println("\f\nIntroduce los datos del otro cantante.");
         agregarOtroCantanteMas();
         mensajeNotificador();
         lista.verLaListaCantantesFamososDetallada();
         System.out.println("\n¿Te gustaría introducir los datos de otro cantante mas (s/n)?");
         volver = "";
         volver = entrada();
    }
     System.out.println("¿Te gustaría remplazar alguno de los datos existentes en nuestra lista (s/n)?");
     String remplazar = "";
     boolean modificacionEnNombre = false;
     boolean modificacionEnDisco = false;
     remplazar = entrada();
    while(remplazar.equals("s") || remplazar.equals("S"))
    {
      if(remplazar.equals("s") || remplazar.equals("S"))
      {
       System.out.println("\f\nElige el numero relacionado con los datos a remplazar\n");
       lista.verPosicionObjetoYDatosQueContiene();
       String posicion = "";
       posicion = entrada();
       int enteroPosicion = 0;
       enteroPosicion = Integer.parseInt(posicion);
       System.out.println("Deseas remplazar el nombre (s/n)?");
       String opcion = "";
       opcion = entrada();
       if(opcion.equals("s"))
       {
         System.out.println("Introduce el nuevo nombre");
         lista.remplazarCantanteEnObjetoPosicion(enteroPosicion);
         modificacionEnNombre = true;
       }
       System.out.println("Deseas remplazar el disco con mas ventas (s/n)?");
       opcion = entrada();
       if(opcion.equals("s"))
       {
         System.out.println("Introduce el nuevo disco con mas ventas");
         lista.remplazarDiscoConMasVentasEnObjetoPosicion(enteroPosicion);
         modificacionEnDisco = true;
       }
       else if(modificacionEnNombre == false && modificacionEnDisco == false)
       {
         System.out.println("\f\nNo realizaste ninguna modificación!\nEsta es nuestra lista de cantantes famosos:\n");
         lista.verLaListaCantantesFamososDetallada();
       }
       else if(modificacionEnNombre == true && modificacionEnDisco == false || modificacionEnNombre == false && modificacionEnDisco == true)
       {
         System.out.println("\f\nSe ha actualizado la lista exitosamente\nEsta es nuestra lista de cantantes famosos:\n");
         lista.verLaListaCantantesFamososDetallada();
       }
      }
      else
      {   
        System.out.println("\f\nSe ha actualizado la lista exitosamente\nEsta es nuestra lista de cantantes famosos:\n");
        lista.verLaListaCantantesFamososDetallada();
      }

      if(modificacionEnNombre == false && modificacionEnDisco == false)
      {
         System.out.println("\n¿Te gustaria intentar nuevamente remplazar algún otro dato existente en nuestra lista (s/n)?");
         remplazar = entrada();       
      }
      else
      {
         System.out.println("\n¿Te gustaría remplazar algún otro dato existente en nuestra lista (s/n)?");
         remplazar = entrada();
      }
     
      if(remplazar.equals("n") || remplazar.equals("N") && modificacionEnNombre == false && modificacionEnDisco == false)
      {   
         System.out.println("\f\nEsta es nuestra lista de cantantes famosos:\n");
         lista.verLaListaCantantesFamososDetallada();
      }     
      else if(remplazar.equals("n") || remplazar.equals("N") && modificacionEnNombre == true || modificacionEnDisco == true)
      {   
         System.out.println("\f\n Se han realizado las modificaciones de forma exitosa\nEsta es nuestra lista de cantantes famosos actualizada:\n");
         lista.verLaListaCantantesFamososDetallada();
      }         
    }
      System.out.println("\nDeseas eliminar algún cantante de nuestra lista de cantantes famosos (s/n)?");
      String eliminar = "";
      eliminar = entrada();
    while(eliminar.equals("s") || eliminar.equals("S"))
    {
      System.out.println("\f\nElige el numero relacionado al cantante que deseas eliminar de la lista:\n");
      lista.verPosicionObjetoYDatosQueContiene();
      String posicion = "";
      posicion = entrada();
      int enteroPosicion = 0;
      enteroPosicion = Integer.parseInt(posicion);
      System.out.println("\f\n El cantante " +
      lista.obtenerObjetoEnPosicion(enteroPosicion).getNombre() + ", ha sido eliminado exitosamente de la lista.\nEsta es nuestra lista actualizada:\n");
      lista.eliminarCantanteEnPosicion(enteroPosicion);
      lista.verLaListaCantantesFamososDetallada();
      System.out.println("\nDeseas eliminar algún otro cantante de nuestra lista de cantantes famosos (s/n)?");
      eliminar = entrada();
    }
    System.out.println("\f\nEsta es nuestra lista de cantantes famosos:\n");
    lista.verLaListaCantantesFamososDetallada();
    System.out.println("\nGracias por ayudarnos a crear nuestra lista de cantantes famosos\nHasta luego.");
  }
    //Metodos de pocas lineas, para evitar duplicar código en el main.
  private static String entrada()//Crea entradas por teclado
  {
    Scanner escaner = new Scanner(System.in);
    return escaner.nextLine();
  }
   
  private static String entradaNombre()//Crea una entrada personalizada para el campo nombre de un objeto tipo Cantante
  {
    System.out.println("Nombre: ");
    return entrada();
  }
 
  private static String entradaDiscoConMasVentas()//Crea una entrada personalizada para el campo discoConMasVentas de un objeto tipo Cantante
  {
    System.out.println("Disco con mas ventas: ");
    return entrada();
  }
   
  private static void agregarOtroCantanteMas()//Agrega un objeto tipo Cantante a la lista
  {
    lista.addObjetoCantante(entradaNombre(), entradaDiscoConMasVentas());
  }
 
  private static void mensajeNotificador()//Notifica de que se ha agregado x cantante a la lista, exitosamente
  {
    System.out.println("\f\nSe ha actualizado la lista con el cantante " + lista.obtenerObjetoEnPosicion(lista.obtenerSizeDeListaDeCantantesF() - 1).getNombre() +
    ", agregado exitosamente!\nEsta es nuestra nueva lista:\n");   
  }
}
public class ListaCantantesFamosos
Código: [Seleccionar]
import java.util.*;
public class ListaCantantesFamosos
{
    private ArrayList<CantanteFamoso> listaDeCantantesF;
    public ListaCantantesFamosos(String nombre, String discoConMasVentas)
    {
      listaDeCantantesF = new ArrayList<CantanteFamoso>();
      addObjetoCantante(nombre, discoConMasVentas);
    }
   
    public void addObjetoCantante(String nombre, String discoConMasVentas)
    {
      listaDeCantantesF.add(new CantanteFamoso(nombre, discoConMasVentas));
    }
   
    public void verPosicionObjetoYDatosQueContiene()
    {
      int i = 0; 
      for(CantanteFamoso datos : listaDeCantantesF)
      {
        System.out.println(i + ": " + datos.getNombre() + " - " + datos.getDiscoConMasVentas()); i++;
      }
    }
   
    public void verLaListaCantantesFamososDetallada()
    {
      Iterator<CantanteFamoso> copiaDeCantanteFamoso = listaDeCantantesF.iterator();
      CantanteFamoso tmpAnalizando;
      int i = 1;
      while(copiaDeCantanteFamoso.hasNext())
      {
        tmpAnalizando = copiaDeCantanteFamoso.next();
        System.out.println("Cantante " + i + " - " + "Nombre: " + tmpAnalizando.getNombre() + ". Disco con mas ventas: " + tmpAnalizando.getDiscoConMasVentas() + "."); i++;
      }
    }
   
    public  void remplazarCantanteEnObjetoPosicion(int posicion)
    {
      CantanteFamoso objeto;
      objeto = listaDeCantantesF.get(posicion);
      objeto.setNombre();
    }
   
    public  void remplazarDiscoConMasVentasEnObjetoPosicion(int posicion)
    {
      CantanteFamoso objeto;
      objeto = listaDeCantantesF.get(posicion);
      objeto.setDiscoConMasVentas();
    }
   
    public void eliminarCantanteEnPosicion(int posicion)
    {
      listaDeCantantesF.remove(posicion);
    }
   
    public CantanteFamoso obtenerObjetoEnPosicion(int posicion)
    {
      return listaDeCantantesF.get(posicion);
    }
   
    public int obtenerSizeDeListaDeCantantesF()
    {
      return listaDeCantantesF.size();
    }
}
public class CantanteFamoso
Código: [Seleccionar]
import java.util.*;
public class CantanteFamoso
{
    private String nombre, discoConMasVentas;
    public CantanteFamoso(String nombre, String discoConMasVentas)
    {
     this.nombre = nombre;
     this.discoConMasVentas = discoConMasVentas;
    }
    //Metodos setters
    public void setNombre()
    {
     nombre = entrada();
    }
   
    public void setDiscoConMasVentas()
    {
     discoConMasVentas = entrada();
    }
    //Metodos getters
    public String getNombre()
    {
     return nombre;
    }
   
    public String getDiscoConMasVentas()
    {
     return discoConMasVentas;
    }
    //otros metodos
    public String entrada()
    {
      Scanner escaner = new Scanner(System.in);
      return escaner.nextLine();
    }
}
Salu2!
« Última modificación: 31 de Agosto 2014, 11:13 por Alex Rodríguez »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio! entrega CU00667B
« Respuesta #1 en: 31 de Julio 2014, 00:13 »
Hola Sniper, te indico las cosas a mejorar (que hay bastantes) en este código:

Clase CantanteFamoso

public void setNombre() { nombre = entrada(); }


La idea está bien y demuestra que tienes cierta soltura en el manejo de código. Sin embargo, aunque como idea pueda entenderse, desde el punto de vista de la programación no es algo adecuado. Oirás a muchos programadores hablar del principio KIS ó Keep it Simple. Otros lo alargar como principio KISS ó Keep it Simple Stupid (esto es más grosero). El asunto es que el código debe mantenerse simple.

El código que has planteado es un método que en realidad no hace otra cosa que llamar a otro método. Hay varias cosas que no son adecuadas en el planteamiento hecho: por un lado, ¿para qué tener un método que únicamente llama a otro? ¿No sería más lógico tener el código directamente sin tener que estar llamándolo?

Por otro lado contraviene otro principio básico de la programación: no inventar de nuevo la rueda. Este principio lo que dice es que hay muchas cosas que los programadores usan y alcanzan el nivel de "convención" entre los programadores, es decir, que todos los programadores trabajan igual porque es algo digamos que todo el mundo acepta.

Un método set, de acuerdo con el convenio tácito entre todos los programadores, es un método que recibe un parámetro para establecer el valor de un atributo. En el método que has planteado no se recibe un parámetro, por tanto va contra el convenio de la comunidad de programadores. No significa que esté mal, pero sí que estás yendo en contra de unos principios básicos de la programación que darían lugar a que cualquier programador que mirara tu código no lo valorara positivamente, es decir, transmitirías que no te atienes al convenio y eso genera rechazo. Tu jefe, o tu profesor, o quien fuera, te dirían... que no, que está bien tratar de innovar cuando se pueda, pero que eso lo corrijas.

En este otro método:

    public void setDiscoConMasVentas()
    {
     discoConMasVentas = entrada();
    }

Tenemos una repetición (también llama al mismo método). En algunas ocasiones, por ser necesario, se repite código. Pero en general también un buen programador mirará con mala cara la repetición de código.

Luego tenemos este método:

    public String entrada()
    {
      Scanner escaner = new Scanner(System.in);
      return escaner.nextLine();
    }

Tampoco encaja bien en la filosofía de la orientación a objetos. En POO cada objeto tiene sus responsabilidades delimitadas. ¿Es lógico que un objeto CantanteFamoso tenga un método que sirva para pedir, de forma genérica, una entrada de teclado? Más bien no, un objeto CantanteFamoso debe limitarse a almacenar la información de un cantante famoso y a tener métodos para gestionar y hacer cosas con dicha información. Pero entre sus responsabilidades no estará, normalmente, el pedir datos al usuario. Esta responsabilidad se debería delegar en otra clase, que podría denominarse EntradaTeclado ó GestorEntradasUsuario ó ... que sería un objeto cuyas responsabilidades, de forma lógica, incluirían el que pida una entrada de teclado.

En programación orientada a objetos tenemos objetos, cada uno con sus tareas... el programa se construye creando objetos y haciendo que interaccionen entre ellos.



Clase ListaCantantesFamosos

Tenemos el constructor:

    public ListaCantantesFamosos(String nombre, String discoConMasVentas)
    {
      listaDeCantantesF = new ArrayList<CantanteFamoso>();
      addObjetoCantante(nombre, discoConMasVentas);
    }

Si esto lo mira un programador no entenderá lo que tratas de hacer, o pensará que estás tratando de inventar la rueda. Un constructor sirve para inicializar los atributos. En este caso la tarea la cumple la primera línea. Si tuviéramos un constructor que recibe parámetros, el parámetro a recibir debería ser un ArrayList, precisamente porque ese es el atributo de la clase. No se atiene a la convención que en esta clase se reciban los datos de un elemento de un ArrayList y se añadan al mismo. Esto no es el objetivo de un constructor. Aquí estás mezclando ideas de un método con ideas de un constructor. La solución es hacer las cosas lo más simples posibles.

      public ListaCantantesFamosos()
    {
      listaDeCantantesF = new ArrayList<CantanteFamoso>();
    }

Con esto resuelto: más sencillo, tenemos que escribir menos, más elegante, y nos atenemos a la convención de la comunidad de programadores.

Aquí hay otra cosa que en cierta manera llama la atención:

      int i = 0; 
      for(CantanteFamoso datos : listaDeCantantesF)
      {
        System.out.println(i + ": " + datos.getNombre() + " - " + datos.getDiscoConMasVentas()); i++;
      }

Un for extendido es un bucle que no usa de índice para su recorrido. Sin embargo estás introduciendo el índice i. De esta manera se mezcla un bucle que no usa índice con un índice: extraño, no es que esté mal, pero llama la atención.

Si queremos usar un índice, lo lógico es usar un bucle con índice, algo así como:

for (int i=0; i<listaDeCantantesF.size(); i++) {
System.out.println(i + ": " + listaDeCantantesF.obtenerObjetoEnPosicion(i).getNombre() + " - " + listaDeCantantesF.obtenerObjetoEnPosicion(i).getDiscoConMasVentas());
}


Aquí otra cosilla a comentar:

      CantanteFamoso objeto;
      objeto = listaDeCantantesF.get(posicion);
      objeto.setNombre();

Podemos escribir:

listaDeCantantesF.get(posicion).setNombre();

Es decir, condensar tres líneas en una.



La clase con el método main no la he revisado, simplemente decirte que debes acortarla y repensarla. El método:

  private static String entradaNombre()//Crea una entrada personalizada para el campo nombre de un objeto tipo Cantante
  {
    System.out.println("Nombre: ");
    return entrada();
  }

¿Es un método para manipular el campo nombre de un objeto Cantante? No debe estar ahí ¿Por qué? Porque la responsabilidad de los campos es de las clases, por tanto la clase con el método main no tiene por qué tener un método para hacer algo que es responsabilidad de un objeto Cantante.

Veo más métodos con el mismo problema ¿están en la clase donde está la responsabilidad?

Ha sido un poco extenso, espero que al menos ayude a sacar algo positivo. Saludos ;)

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio! entrega CU00667B
« Respuesta #2 en: 31 de Julio 2014, 02:35 »
 Yo diría que mas que sacar algo positivo, sacare muuuchisimo positivo, ya estoy trabajando en el rediseño del código, no posteare el ejercicio nuevamente pero te puedo asegurar que corregire todos los puntos comentados y me esforzare para identificar alguna otra posible debilidad o reinvención de la rueda, lolz  ;D, Muchísimas gracias Cesar por tener la amabilidad de emplear tu tiempo en verificar y comentar mi código.
Saludos!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

 

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".