Autor Tema: La clase arraylist del API de JAVA (CU00665B)  (Leído 3266 veces)

hymsoft

  • Intermedio
  • ***
  • Mensajes: 103
  • hymsoft
    • Ver Perfil
La clase arraylist del API de JAVA (CU00665B)
« en: 13 de Julio 2016, 22:44 »
pffff buenas!!! complicado con los trabajos, asi que entregando en la medida que voy pudiendo :-)

mis 3 clases y como siempre el test en captura :-)

Saludos desde los -6 grados que hace hoy por estos lados :-(

Código: [Seleccionar]
/**
 * Clase principal para resolucion ejercicio CU00665B
 *
 * @author Hugo Segura
 * @version (a version number or a date)
 */
public class TestListaCantantesFamosos
{
    public static void main(String[] args){
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos();//Creo el objeto
       
        System.out.println("Empecemos con el programa");
        System.out.println("-------------------------");
        System.out.println("Introduce el nombre de 2 cantantes famosos...");
        System.out.println("Nombre del Cantante 1:");
        EntradaDeTeclado entrada1 = new EntradaDeTeclado();
        System.out.println("Nombre del Cantante 2:");
        EntradaDeTeclado entrada2 = new EntradaDeTeclado();
        System.out.println("\nMuchas Gracias...");
        //agrego los nombres solicitados
        lista1.agregarNombre(entrada1.getEntrada());
        lista1.agregarNombre(entrada2.getEntrada());
               
        System.out.println("\nEl listado de mis Cantantes Famosos mas los tuyos es el siguiente:\n");
        lista1.listarNombres();//Listo todos los nombres
    }
}

Código: [Seleccionar]
/**
 * Clase para manipular la entrada por teclado
 *
 * @author aprenderaprogramar
 * @version
 */
import java.util.Scanner;

public class EntradaDeTeclado
{
   private String entradaTeclado;//variable de instancia de clase
   
   //Constructor
   public EntradaDeTeclado(){
       entradaTeclado = "";
       pedirEntrada();//Llamada a un metodo interno. Al crear el objeto automaticamente ejecutamos el metodo
   }//cierre constructor
   
   public void pedirEntrada(){//metodo de clase
       Scanner  entradaScanner = new Scanner(System.in);
       entradaTeclado = entradaScanner.nextLine();
    }//cierre pedir entrada
   
    public String getEntrada(){return entradaTeclado;}//Cierre getEntrada
   
    public String getPrimeraPalabra(){
        for(int i = 0;i<entradaTeclado.length() -1;i++){
            if(entradaTeclado.substring(i,i+1).equals(" ")){return entradaTeclado.substring(0,i+1);}
            //si no se detecta ningun espacio se devuelve la cadena completa
        }//cierre for
        return entradaTeclado;   
    }//cierre get PrimeraPalabra
   
    public int getLongitud(){//metodo de clase
        return entradaTeclado.length();
    }//cierre getLongitud
}

Código: [Seleccionar]
/**
 * Clase generica de cantantes famosos
 *
 * @author Hugo Segura
 * @version (a version number or a date)
 */

import java.util.ArrayList;

public class ListaCantantesFamosos
{
    //Declaracion de variables
        private String nombreDeLaLista = "CantantesFamosos";
        private ArrayList<String> listadenombres;//Array de objetos string que va a guarar los nombres
    //fin declaracion variables
   
    //Constructor
    public ListaCantantesFamosos(){
        listadenombres = new ArrayList<String>();//creo el array
        //Agrego 3 nombres por defecto
        agregarNombre("David Gilmour");
        agregarNombre("Brian Johnson");
        agregarNombre("Rod Evans");
    }//cierre constructor
   
    //Metodo para agregar nombres a la lista
    public void agregarNombre(String nombreCantante){
        listadenombres.add(nombreCantante);
    }//fin metodo agregarNombre
   
    //Metodos para imprmir los nombres
    public void listarNombres(){
        //como no recibe parametros imprimo todos los nombres del listado
        for(int i = 0; i < listadenombres.size();i++){
            System.out.println(elNombre(i));
        }
    }//fin listarNombres
   
    //Metodos para imprmir los nombres
    public void listarNombres(int posicion){
        //como recibe un parametro uso el metodo correspondiente para obtener un nombre
        System.out.println(elNombre(posicion));
    }//fin listarNombres
   
    //Metodo que devuelve el nombre en una posicion especificada
    //lo encapsulo para que usen el metodo listarNombres con o sin argumentos segun el listado que se necesite
    private String elNombre(int posicion){
        if (posicion >= 0 && posicion < listadenombres.size()){
            return listadenombres.get(posicion);
        }else{
            return "No existe nombre para la posicion indicada";
        }
    }//fin elNombre
}
"Una persona inteligente es aquel que sabe ser tan inteligente como para contratar gente mas inteligente que el"

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:La clase arraylist del API de JAVA (CU00665B)
« Respuesta #1 en: 14 de Julio 2016, 19:12 »
 Hola hymsoft!

Tu solución a este ejercicio cumple con lo requerido en el enunciado del mismo.

No obstante, podemos mejorar mucho tu código, es bueno que tengas claras algunas cosas a la hora de escribir o estructurar código, por ejemplo ten en cuenta:

Redundancia: Si tienen la misma función y rendimiento, un código limpio, ligero y claro es preferido por todos ante un código robusto y con exceso de código innecesario. Un buen programador evita reinventar la rueda. (redundancia de código)

Reutilizar código: La reutilizacion de código es nuestro mejor aliado para crear un código mas limpio, ligero y amigable a los ojos de quien lo lee.

Delegación de responsabilidades: Una clase debe de hacer lo que dice su nombre  que es o que hace y solo eso. Si es una clase EntradaDeTeclado, debe de limitarse a solo eso, generar una entrada para que el usuario pueda escribir, cosas como mostrar mensajes en pantalla desde esta clase o analizar y realizar operaciones (diferente a guardar lo escrito en la entrada) con el valor de lo escrito por el usuario no son propias de un código bien estructurado.

He editado tu código y he dejado algunos comentarios en cada clase que tal vez te puedan ser útiles. Cuando ejecutes el código, veras un mismo resultado con muchas menos lineas de código (sin contar los comentarios XD)

A continuación tus tres clases con ciertas modificaciones:

EntradaDeTeclado
Código: [Seleccionar]
/**
 * Clase para manipular la entrada por teclado
 *
 * @author aprenderaprogramar
 * @version
 */
import java.util.Scanner;


/*Una clase debe de hacer lo que su nombre dice que es o que hace y no nada mas.*/
public class EntradaDeTeclado
{
   
//Constructor por defecto
   public EntradaDeTeclado(){
   
   /*Este constructor puede ser invocado aun si no estuviese declarado en esta clase, siempre y cuando
    * no exista ningún otro constructor (con argumento/s) declarado en esta clase, se considera buena practica el declararlo */
       
   }//cierre constructor por defecto
   
   /*Este método retorna un String como resultado de lo que el usuario escriba por teclado*/
   public String pedirEntrada(){//metodo de clase
       Scanner  entradaScanner = new Scanner(System.in);
       String entradaTeclado;
       entradaTeclado = entradaScanner.nextLine();
       return entradaTeclado;
    }//cierre pedir entrada
   
   
}

ListaCantantesFamosos
Código: [Seleccionar]
/**
 * Clase generica de cantantes famosos
 *
 * @author Hugo Segura
 * @version (a version number or a date)
 */

import java.util.ArrayList;
import java.util.List;


/*Para un buen programador, los métodos get y set de una variable de clase, no son opcionales
 * Siempre han de ser declarados aun cuando se crean innecesarios*/
public class ListaCantantesFamosos
{
    //Declaracion de variables
    private List<String> listadenombres = new ArrayList<String>();/*Array de objetos string
    que va a guarar los nombres*/
    //fin declaracion variables
   
    //Constructor
    public ListaCantantesFamosos(){
        //Agrego 3 nombres por defecto
    /*No es logico crear un metodo agregarCantante, cuando java nos proporciona el
    * metodo add(String value) para los tipo List, y realiza exactamente lo que necesitamos que es
    * agregar un String al ArrayList de String, hacer esto se considera reinventar la rueda o
    * redundancia*/
        listadenombres.add("David Gilmour");
        listadenombres.add("Brian Johnson");
        listadenombres.add("Rod Evans");
    }//cierre constructor

public List<String> getListadenombres() {
return listadenombres;
}

public void setListadenombres(List<String> listadenombres) {
this.listadenombres = listadenombres;
}
   
   
}

TestListaCantantesFamosos
Código: [Seleccionar]
/**
 * Clase principal para resolucion ejercicio CU00665B
 *
 * @author Hugo Segura
 * @version (a version number or a date)
 */

/*La clase con el método main es la responsable de dirigir el flujo del programa y en este caso, responsable
 * de realizar tareas con los valores de lo escrito por el usuario y de mostrar mensajes en pantalla*/
public class TestListaCantantesFamosos
{
    public static void main(String[] args){
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos();//Creo el objeto
        EntradaDeTeclado entradaDeTeclado = new EntradaDeTeclado();/*Con este unico objeto, pediremos
        todas las entradas de datos al usuario (reutilizacion de código)*/
       
        //Declaramos dos variables tipo String que contendrán cada una un valor escrito por el usuario
        String entrada1, entrada2;//Si son de un mismo tipo, podemos declararlas en una sola linea, separadas por comas
       
        System.out.println("Empecemos con el programa\n-------------------------\nIntroduce "
        + "el nombre de 2 cantantes famosos...\n\nNombre del Cantante 1:");
        entrada1 = entradaDeTeclado.pedirEntrada();
        System.out.println("Nombre del Cantante 2:");
        entrada2 = entradaDeTeclado.pedirEntrada();
        System.out.println("\nMuchas Gracias...");
        //agrego los nombres solicitados
        lista1.getListadenombres().add(entrada1);
        lista1.getListadenombres().add(entrada2);
               
        System.out.println("\nEl listado de mis Cantantes Famosos mas los tuyos es el siguiente:\n");
        int i = 0;/*Usaremos esta variable como un contador en el for each (otra opción seria usar un bucle
        for normal)*/
        for(String cantante: lista1.getListadenombres()){//Usamos un for each para recorrer la lista de cantantes
        i++;
        System.out.println("Cantante " + i + ": " + cantante);//Listo todos los nombres
        }
    }
}

Cualquier duda, no dudes en preguntar.

Saludos!!
« Última modificación: 18 de Julio 2016, 18:19 por Alex Rodríguez »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

hymsoft

  • Intermedio
  • ***
  • Mensajes: 103
  • hymsoft
    • Ver Perfil
Re:La clase arraylist del API de JAVA (CU00665B)
« Respuesta #2 en: 14 de Julio 2016, 20:20 »
Hola Jorge, buenas tardes por estos lados. Agradezco mucho tus comentarios. Todavia me cuesta horrores lo de hacer pequeñas clases para llegar a un todo. Vengo de clipper y foxpro, con una GRAAAAN libreria propia de rutinas :-).

Lo de los metodos set y gets obligatorios (como buen programador) voy a tener que trabajar mas en ello.

La clase EntradaTeclado es la que veníamos trabajando en el curso. Muchas gracias por la depuración y por el comentario /*Una clase debe hacer lo que su nombre dice que es o que hace y nada mas*/ jajajaja mas claro no me lo podias haber puesto.

Lo que si no entiendo es por que no puedo tener un metodo en la clase ListaCantanteFamosos que me imprima todo el listado o solo un cantante, y llamar a ese metodo desde la main.

*El for each es del ejercio que viene, jejejeje lo estaba leyendo cuando me llego tu comentario :-)

Ojala me puedas sacar de esa duda ;-)
"Una persona inteligente es aquel que sabe ser tan inteligente como para contratar gente mas inteligente que el"

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:La clase arraylist del API de JAVA (CU00665B)
« Respuesta #3 en: 18 de Julio 2016, 18:23 »
Hola hymsoft, algunas cosas se pueden resolver de distintas maneras y en algunas ocasiones distintos programadores experimentados resuelven un problema de distintas formas. En este caso yo no veo problemas en que tengas un método en la clase ListaCantantesFamosos que imprima todo el listado o que imprima un cantante, siempre que esos métodos hagan exactamente lo que dice su nombre y nada más.

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