Autor Tema: Java. Clase ArrayList. Métodos add, size, etc. Ejercicio comentado CU00665B  (Leído 2922 veces)

Luis Fdo Carvajal

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 37
    • Ver Perfil
Respuesta para ejercicio CU00665B del tutorial básico de programación Java con BlueJ

Quisiera saber de este resultado:

Crea una clase denominada ListaCantantesFamosos que al ser inicializada contenga un ArrayList con tres Strings que sean el nombre de cantantes famosos (Miguel Bose, Rafael, Juanes). Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos, pida dos cantantes famosos más al usuario, los añada a la lista y muestre el contenido de la lista por pantalla.

Código: [Seleccionar]
import java.util.ArrayList; //import java.util.* más genérico
public class ListaNombres {
    private String nombreDeLaLista; //Establecemos un atributo nombre de la lista
    private ArrayList<String> listadenombres; //Declaramos un ArrayList que contiene objetos String
   
public ListaNombres (String nombre) {    //Constructor: crea una lista de nombres vacía

        nombreDeLaLista = nombre;
        listadenombres = new ArrayList<String>(); //Creamos el objeto de tipo ArrayList
        listadenombresList.size(); //(Uso del método obtener el número de objetos en la lista):

    } //Cierre del constructor
   public void addNombre (String valor_nombre) {
listadenombres.add (valor_nombre);
} //Cierre del método   


public class TestListaDeNombres {
    public static void main (String [ ] args) {
        System.out.println ("Empezamos el programa");   
       
while (listadenombres.size().length() >= i ) {

for (int i=0; i =< listadenombres.size().length() () - 1; i++) {

System.out.println ("Por favor introduzca nombre del cantante:");         
        String entradaTeclado = "";

Scanner entradaEscaner = new Scanner (System.in); //Creación de un objeto Scanner
        entradaTeclado = entradaEscaner.nextLine (); //Invocamos un método sobre un objeto Scanner
       
Listadenombres lista1 = new ListaDeNombre("Nombres introducidos por usuario");
        lista1.addNombre (entrada.getEntrada() );

System.out.println ("Entrada recibida por teclado es: \"" + entradaTeclado +"\"");
lista1= sc.nextLine();  //acada cantante agrega un linea vacía dentro de la lista.
               
}
return listadenombres.size().length();

break;

}// parar bucle While

                System.out.println ("Gracias");

        lista1.addNombre (entrada1.getEntrada() )
        lista1.addNombre (entrada2.getEntrada() );
        lista1.addNombre (entrada3.getEntrada() );
        lista1.addNombre (entrada4.getEntrada() );
        lista1.addNombre (entrada5.getEntrada() );

        System.out.println ("La lista ha quedado formada por " + lista1.getTamaño() + " elementos");
        System.out.println ("Elemento 1: " + lista1.getNombre(0) );
        System.out.println ("Elemento 2: " + lista1.getNombre(1) );
        System.out.println ("Elemento 3: " + lista1.getNombre(2) );
        System.out.println ("Elemento 4: " + lista1.getNombre(3) );
        System.out.println ("Elemento 5: " + lista1.getNombre(4) );
    } //Cierre del main
} //Cierre de la clase
Gracias
« Última modificación: 26 de Mayo 2017, 19:10 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ejercicio (CU00665B)
« Respuesta #1 en: 19 de Marzo 2017, 00:44 »
Hola Luis.
Supongo que ya sabes que este programa no funciona porque no creo que ningún compilador lo haya dado por bueno.
Vamos por partes

Sobre los atributos, a parte del ArrayList has incluido un String para el nombre de la lista.
Este atributo no se pide en el enunciado del ejercicio y no es necesario crearlo. Si quieres añadirlo tú, por voluntad propia, pues bueno... pero sobre todo que tengas claro que no es necesario para este ejercicio.
Podría ser útil en otra situación, por ejemplo un programa que gestionase varias listas de cantantes, entonces si sería útil un atributo que las identificase para distinguirse unas de otras.

Sobre el constructor...
la tercera línea donde llamas al método .size(), además de erronea (no existe el atributo listadenombresList) es innecesaria.
Primero porque si la lista está recien inicializada, su size (tamaño) es obviamente "cero" elementos.
Sea cero o no, en ese momento no necesitamos saber su size().
Y además, tal y como llamas al método, te está devolviendo un valor que no estás recogiendo en ningún sitio, con lo cuál, ese valor desaparece en la siguiente línea.
Este metodo tiene sentido llamarlo en un bucle, en un if o bien guardando su valor en una variable de tipo int, por ejemplo:
Código: [Seleccionar]
int tamanoLista = listadenombres.size();
Así que no es necesaria esa tercera línea del constructor.
Por cierto, aunque a muchos compiladores les dará igual y como mucho se quejarán un poquito..., acostumbrate a usar las convenciones Java a la hora de poner nombres a variables y clases.
Es de uso y costumbre usar la notacíon CamelCase, es decir, los nombres de variables o clases compuestas de varias palabras, cada palabra se distingue de la otra poniendo la primera letra en mayúsculas.
Esto es así tanto para las clases como para las variables (lo cual incluye a objetos y atributos de clases, que son en realidad variables)
La diferencia es que las clases empiezan por mayusculas y las variables en minuscula, aunque el resto de palabras que componen el nombre si empiezan en mayúscula.
Ejemplo.
Nombre de clase ---> EstoEsUnaClase
Nombre de variable, atributo u objeto ----> estoEsUnaVariable

Se desaconseja usar abreviaturas o guiones bajos para separar palabras, por ejemplo:
lista_de_nombres;
Este tipo de notación si se usa en C/C++, pero no es costumbre usarla en Java...aunque funcionar, funcionará...


Siguiendo con el constructor, fíjate que el enunciado indica que al inicializarse el objeto de la clase ListaCantantesFamosos, ya ha de incluir tres nombres  (Miguel Bose, Rafael, Juanes).
Esto pues, ha de realizarse también en el constructor.
Es decir, después de la segunda línea donde incializar el ArrayList, deberías incluir tres líneas más, cada una llamando al método .add("nombre de un famoso"); para incluir esos tres nombres que solicita el enunciado.

También puedes inicializar el ArrayList pasandole a su constructor un Collection que contenga esos tres nombres. Ver documentacion Java.
Pero ahora no vale la pena complicarse la vida con esto.


Vale, terminado el constructor, hay que pensar que métodos necesitará la clase ListaCantantesFamosos para cumplir lo que se nos pide en el enunciado.

Tu método para añadir un nuevo nombre a  la lista es correcto y no necesita ser modificado. (excepto lo de usar la notación CamelCase que es estila en Java)


El enunciado además pide que, tras añadir dos nombres más a la lista, se muestre un listado con todos lo nombres.
Tú has hecho una movida rara dentro del main()..  :o creando un nuevo objeto Listadenombres lista1...el cuál es imposible porque listanombres es un atributo de la clase ListaCantantesFamosos, no es una clase con la que poder crear nuevos objetos.

Luego veo objetos entrada1, entrada2, entrada3..  que no se sabe de donde salen...y que poseen un supuesto método getEntrada()...

Así que olvida todo eso que has hecho. Lo ideal es crear otro método más llamado por ejemplo:
public void listarNombres()
...que se encargará de recorrer uno a uno los elementos del ArrayList mediante un bucle for (o un while, pero un for quizás sea más apropiado) y escribiendolos en pantalla.
Intenta codificar tú este método, si no te sale lo corregimos aquí en el foro.


Tras esto, ya en el main(), solo quedaría:

inicializar el objeto ListaCantantesFamosos, por ejemplo:
Código: [Seleccionar]
ListaCantantesFamosos listaCantantes = new ListaCantantesFamosos("Nombre de Lista);
//Recordemos que el nombre de lista es un atributo que lo añades tú, si lo deseas...
//no forma parte del enunciado original

pedir dos nombres por teclado que agregaremos a la lista mediante el método
Código: [Seleccionar]
listaCantantes.addNombre(String)
Para pedir los nombres solo necesitas crear un objeto Scanner y un objeto String para guardar el nombre que introduzca por teclado.
Aunque pediremos dos nombres, no necesitas dos objetos String. Te basta con uno:
pides nombre y lo guardas en el String..., lo añades al arraylist,
... pides otro nombre y lo guardas en el mismo String (ya no importa que se borre el nombre anterior).. lo añades...

De hecho, se puede hacer sin usar ningún objeto String, pero hazlo usando un objeto String, y luego veremos como se puede hacer sin tener que usarlo.

y por último mostrar el listado llamando al método:
Código: [Seleccionar]
listaCantantes.listarNombres();


Como ves, hay bastante que corregir en tu ejercicio. Pero oye, no te desesperes, debemos poner en valor que lo has intentado y te has esforzado en escribir bastante código según te suponías como iba a funcionar.
Conozco gente que lleva tiempo estudiando esto en el institituo...y aún se quedan en blanco sin saber qué escribir en ejercicios similares.

Esto de la programación resulta algo confuso al principio, pero en poco tiempo y cometiendo errores inevitables...acaba resultando tan lógico y sencillo casi como el hablar diario je je
« Última modificación: 19 de Marzo 2017, 01:00 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Luis Fdo Carvajal

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 37
    • Ver Perfil
Re:Ejercicio (CU00665B)
« Respuesta #2 en: 30 de Marzo 2017, 21:25 »
Buenas noches,
Aquí va el nuevo código ya compilado
Gracias

Código: [Seleccionar]
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cantantesfamosos;
import java.util.ArrayList;
//import java.util.* más genérico
public class ListaNombres {
    private String nombreDeLaLista; //Establecemos un atributo nombre de la lista
    private ArrayList<String> listadenombres; //Declaramos un ArrayList que contiene objetos String
   
public ListaNombres (String nombre) {    //Constructor: crea una lista de nombres vacía

        nombreDeLaLista = nombre;
        listadenombres = new ArrayList<String>(); //Creamos el objeto de tipo ArrayList
       

    } //Cierre del constructor
   
   public void addNombre (String valor_nombre) { listadenombres.add (valor_nombre);}
 //Cierre del método
 
public String getNombre (int posicion) { //Método

        if (posicion >= 0 && posicion < listadenombres.size() ) {

            return listadenombres.get(posicion); }

        else { return "No existe nombre para la posición solicitada";}

    } //Cierre del método 

 

    public int getTamaño () { return listadenombres.size(); } //Cierre del método

 

    public void removeNombre (int posicion) {  //Método

        if (posicion >= 0 && posicion < listadenombres.size() ) {

            listadenombres.remove(posicion); }

        else { } //else vacío. No existe nombre para la posición solicitada, no se ejecuta ninguna instrucción

    } //Cierre del método removeNombre

} //Cierre de la clase
Código: [Seleccionar]
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cantantesfamosos;
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 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 ()  {

 

     /*IMPORTANTE: 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
Código: [Seleccionar]
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cantantesfamosos;

/**
 *
 * @author ITCO1724
 */
// Aquí el test con el método main ejemplo aprenderaprogramar.com

public class TestListaDeNombres {

    public static void main (String [ ] args) {

        System.out.println ("Empezamos el programa");   

        System.out.println ("Por favor introduzca nombre 1:");
        EntradaDeTeclado entrada1 = new EntradaDeTeclado();
        System.out.println ("Por favor introduzca nombre 2:");
        EntradaDeTeclado entrada2 = new EntradaDeTeclado();
        System.out.println ("Por favor introduzca nombre 3:");
        EntradaDeTeclado entrada3 = new EntradaDeTeclado();
        System.out.println ("Gracias");

        ListaNombres lista1 = new ListaNombres("Nombres introducidos por usuario");

        lista1.addNombre (entrada1.getEntrada() );
        lista1.addNombre (entrada2.getEntrada() );
        lista1.addNombre (entrada3.getEntrada() );

        System.out.println ("La lista ha quedado formada por " + lista1.getTamaño() + " elementos");

        System.out.println ("Elemento 1: " + lista1.getNombre(0) );
        System.out.println ("Elemento 2: " + lista1.getNombre(1) );
        System.out.println ("Elemento 3: " + lista1.getNombre(2) );

    } //Cierre del main

} //Cierre de la clase

 

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