Autor Tema: ¿recibir un objeto en un parámetro es recursividad? Java , Iterator CU00667B  (Leído 4279 veces)

camoay

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 44
    • Ver Perfil
Hola, les adjunto el ejercicio CU00667B del tutorial de programación orientada a objetos con Java:

EntradaDeTeclado:
Código: [Seleccionar]
package com.aprenderaprogramar.java.iniciacion.clase65;
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 ()  {
for (int i=0; i < entradaTeclado.length() - 1; i++) {
if (entradaTeclado.substring (i, i+1).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

CantanteFamoso:
Código: [Seleccionar]
package com.aprenderaprogramar.java.iniciacion.clase67;

public class CantanteFamoso {
String nombre;
String discoConMasVentas;

CantanteFamoso(String anombre, String adisco){
nombre = anombre;
discoConMasVentas = adisco;
}
public String getNombre() {
return nombre;
}
public String getDiscoConMasVentas() {
return discoConMasVentas;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setDiscoConMasVentas(String discoConMasVentas) {
this.discoConMasVentas = discoConMasVentas;
}
}// end class

ListaCantantesFamosos:
Código: [Seleccionar]
package com.aprenderaprogramar.java.iniciacion.clase67;
import java.util.ArrayList;
import java.util.Iterator;

public class ListaCantantesFamosos {
//Declaramos un ArrayList que contiene objetos CantanteFamoso
private ArrayList<CantanteFamoso> listaCantantesFamosos;

   //el constructor inicializa el ArrayList para evitar errores NullPointerException
ListaCantantesFamosos() {
   listaCantantesFamosos = new ArrayList<CantanteFamoso>();
}//end constructor
   
public void addCantante(CantanteFamoso cantante) {
   listaCantantesFamosos.add(cantante);
} //end method
   
public void ListarTodosLosCantantes(){ 
   Iterator<CantanteFamoso> iter = listaCantantesFamosos.iterator();
   System.out.println ("Los cantantes de la lista son: ");
   CantanteFamoso tmpCantante;
   while(iter.hasNext()){
  tmpCantante = iter.next();
  System.out.println(tmpCantante.getNombre()+" y su disco con mas ventas es "+ tmpCantante.getDiscoConMasVentas());
   }// end while
}//end method
} //Closing the class

Test:
Código: [Seleccionar]
package com.aprenderaprogramar.java.iniciacion.clase67;
import com.aprenderaprogramar.java.iniciacion.clase65.EntradaDeTeclado;

public class Test {
public static void main(String[] args) {
CantanteFamoso cantante1 = new CantanteFamoso("Peret","Mi carro...");
CantanteFamoso cantante2 = new CantanteFamoso("Enya", "Moonlight");
ListaCantantesFamosos lista = new ListaCantantesFamosos();
lista.addCantante(cantante1);lista.addCantante(cantante2);
lista.ListarTodosLosCantantes();
String nombre = "";
String discoMasVentas = "";
do{
System.out.println("Introduzca un nuevo nombre de cantante o pulse 'n' para salir");
EntradaDeTeclado entrada = new EntradaDeTeclado();
nombre = entrada.getEntrada();
// si no uso el condicional la "n" de salida la añadiría como nombre de cantante
// por contra, da la posibilidad de salir sin añadir un nuevo cantante
// Si realmente quieren que siempre pida un cantante nuevo, tengo que añadir mas código
// antes del Do...while
if(!(nombre.equals("n") || nombre.equals("N"))){
System.out.println("Introduzca su disco con mas ventas : ");
EntradaDeTeclado entrada1 = new EntradaDeTeclado();
discoMasVentas = entrada1.getEntrada();
CantanteFamoso cantante = new CantanteFamoso(nombre,discoMasVentas);
lista.addCantante(cantante);
lista.ListarTodosLosCantantes();
}
}while(!(nombre.equals("n") || nombre.equals("N")));
}
}

Muchas gracias por sus comentarios.
« Última modificación: 29 de Septiembre 2016, 19:31 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Java , Iterator , ejercicio CU00667B
« Respuesta #1 en: 20 de Septiembre 2016, 21:43 »
Hola camoay, tu código es un buen código aunque el planteamiento del do while con el condicional puede mejorarse (no es adecuado tener el if dentro del do while).

Para ver cómo plantearlo para evitar ese condicional consulta https://www.aprenderaprogramar.com/foros/index.php?topic=2889.0

De resto todo bien.

Saludos

camoay

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 44
    • Ver Perfil
Re:Java , Iterator , ejercicio CU00667B
« Respuesta #2 en: 23 de Septiembre 2016, 15:44 »
Muchas gracias Alex, por tus comentarios y recomendaciones. Me gustó el código del compañero de curso Barriway, aunque me quedé desconcertado con uno de sus constructores en CantanteFamoso, que como parámetro recibe otro objeto del mismo tipo que se está definiendo en la clase ( como si fuera una recursividad ), aunque tras examinarlo un poco ( y dado que no daba errores de compilación) me dió la sensación que sirve para clonar objetos de otro ya existente. Me podrías aclarar este caso?

Aprovecho para agradecerles a todos los Moderadores su generosa y gran labor de corrección y enhorabuena por el curso tan práctico e interactivo que han creado.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:¿recibir un objeto en un parámetro es recursividad? Java , Iterator CU00667B
« Respuesta #3 en: 29 de Septiembre 2016, 19:33 »
Hola camoay supongo que te refieres a este constructor

Código: [Seleccionar]
    public CantanteFamoso(CantanteFamoso cantanteFamoso){
        this.nombre=cantanteFamoso.getNombre();
        this.discoDeMasVentas=cantanteFamoso.getDiscoMasVentas();
    }

En este constructor no hay recursividad. Lo que hace el constructor es recibir un objeto como parámetro, y utilizar ese objeto para crear un nuevo objeto (cuando se invoque new) que tendrá los atributos con los mismos valores que el objeto recibido.

La clave aquí es que hay que acostumbrarse a trabajar con objetos, pensar en objetos, manipular objetos, etc. ¡La programación Java se basa en objetos en casi todo!

Saludos

camoay

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 44
    • Ver Perfil
Re:¿recibir un objeto en un parámetro es recursividad? Java , Iterator CU00667B
« Respuesta #4 en: 30 de Septiembre 2016, 14:04 »
Hola Alex,

Referente a lo de la recursividad, mi confusión vino por el hecho de que "declarando la propia clase CantanteFamoso", dentro puedas insertar un constructor que hace uso de objetos "de la misma clase", sin haber terminado su declaración.

Por eso me recordó a un método que usa recursividad, en el que dentro del propio método, haces una llamada al mismo método sin haber terminado su declaración.

Y por supuesto que estoy en pañales con la POO. Yo estudié  con programación estructurada hace muchos años.

Gracias por vuestra santa paciencia y dedicación.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Bueno aquí hay mucha gente que está ayudando y todos hemos pasado por lo mismo. La cosa es ir aprendiendo, y espero que poco a poco vayas ayudando a responder también a personas que estén realizando un aprendizaje que tú ya hayas adquirido. Es decir, la idea es que quienes van más avanzado ayuden en los foros a quienes van menos avanzados. Saludos.

camoay

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 44
    • Ver Perfil
Bueno tras un parón forzoso vuelvo a retomar el curso. Respondiendo a Alex Rguez. : Si que tenía pensado ofrecerme a revisar ejercicios, aunque esperaba que Ustedes tomaran la iniciativa de pedírmelo y al menos terminar el curso de iniciación para sentirme mas seguro, pues para mi significa una gran responsabilidad. Mi objetivo es seguir con el curso de java avanzado y poco a poco empezar el de javascript ... y Ajax.  A propósito, te queria preguntar si, ¿ han decidido ya si sacan el curso de Java EE? 
Saludos

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola, pues ya hemos tomado la iniciativa de pedírte que ayudes en los foros a responder a personas que estén iniciándose. No es necesario esperar a que termines el curso. Vete respondiendo algunos hilos poco a poco, no te preocupes porque revisamos todos los hilos, por tanto no hay tanta responsabilidad en el sentido de que si se comete algún error en una revisión lo comentamos y no pasa nada, aquí estamos todos ayudándonos y aprendiendo. Nuestra intención es sacar muchos cursos más, el problema es que ofrecer cursos gratuitos requiere mucho esfuerzo y tenemos que hacerlo poco a poco porque es un trabajo altruista y voluntario. Ya que comentas algo sobre JavaScript, en caso de ir por esa línea (programación web) el orden correcto para seguir los cursos sería: primero el de HTML, luego el de CSS, luego el de JavaScript, luego el de PHP y luego el de Ajax. Saludos,

camoay

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 44
    • Ver Perfil
Hola Alex, pues entonces de acuerdo. Calculo que en una semana podré dedicarme tanto a empezar a revisar ejercicios, como a continuar mi curso.
Gracias por las recomendaciones respecto al orden de los cursos, realmente de los indicados sólo necesito repasar javascript y el Ajax desde cero. 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".