Autor Tema: CU00678B Concepto definición de polimorfismo en Java. ¿Qué es el polimorfismo?  (Leído 4028 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes, dejo la solución de mi ejercicio aunque no estoy nada satisfecho.

No se si es la vuelta de Semana Santa pero he encontrado especialmente complicado el ejercicio ( lo cual no es malo ) la razón de que no me convenza es que saco por pantalla los contenidos de los objetos en conjunto y no la información concreta que alberga cada uno. El resultado es el mismo pero en conjunto [ 2, 8,5 ] [ sol, luna,saturno ].

Clase Estrellas

Código: [Seleccionar]
import java.util.HashSet;

public class Estrellas{
   
    private HashSet <String> stars = new HashSet <String>();
   
    public Estrellas(){  //constructor inicializado por defecto
        stars.add("sol");
        stars.add("luna");
        stars.add("saturno");
    }//cierre contructor
   
    public HashSet <String> getEstrellas() { return stars; }
} //cierre clase

Clase Numeros

Código: [Seleccionar]
import java.util.TreeSet;

public class Numeros {
   
    private TreeSet <Integer> numbers = new TreeSet <Integer>();
   
    public Numeros(){  //contructor crea por defecto los objetos
        numbers.add(2);
        numbers.add(8);
        numbers.add(5);
    }
   
    public TreeSet<Integer> getNumeros(){ return numbers; }
}

Clase ConjuntoSet

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Set;

public class ConjuntoSet {

    private ArrayList <Set> conjuntoObjetos = new ArrayList <Set>();

    public ConjuntoSet(){
        //Creo objeto Estrellas y lo añado al conjuntoObjetos
        Estrellas estrella1 = new Estrellas();
        conjuntoObjetos.add(estrella1.getEstrellas());
        //Creo objeto Numeros y lo añado al conjuntoObjetos
        Numeros numero1 = new Numeros();
        conjuntoObjetos.add(numero1.getNumeros());
    }

    public ArrayList<Set> getConjunto(){return conjuntoObjetos; }
}

Clase GestorIterador

Código: [Seleccionar]
import java.util.Iterator;


public class GestorIterador {

    public static void main (String [] args){

        ConjuntoSet prueba = new ConjuntoSet();

        Iterator iter = prueba.getConjunto().iterator();

        while(iter.hasNext()){
            System.out.print(iter.next());}

    }
}

Quizás si en la clase ConjuntoSet, creara fuera del contructor los new Estrellas y Numeros, podria llamarlos en el main con un get que los devolviera y hacer un Iterador independiente de cada uno, pero no me convence demasiado tampoco.

Después de mirar un poco algun ejercicio de compañeros añado la clase GestorIterador con lo que creo soluciona mi problema, que imprimia en conjunto y no por separado los elementos.

Clase GestorIterador (Mejorada creo)

Código: [Seleccionar]
import java.util.Iterator;
import java.util.Set;


public class GestorIterador {

    public static void main (String [] args){

        ConjuntoSet prueba = new ConjuntoSet();

        Iterator <Set> iterConjunto = prueba.getConjunto().iterator();

        while(iterConjunto.hasNext()){
            Iterator iterObjetos = iterConjunto.next().iterator();
                 
              while(iterObjetos.hasNext()){
                  System.out.print(iterObjetos.next() + ", "); }
               
        }

    }
}

Veo no es lo mismo Iterador iter, que Iterador <Set> iter, le avisas que dentro del iter habra nuevos Objetos de tipo Set que puedes volver a iterar, eso creo, este ejercicio es algo lío
« Última modificación: 07 de Abril 2015, 20:37 por Lorenzo31 »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola Lorenzo, este ejercicio tiene su complicación pero para eso estamos aquí, también hay que saber enfrentarse a situaciones un poco más complejas. Has resuelto el ejercicio de manera un poco distinta a como lo suelen hacer otras personas ya que has utilizado varias clases. Si te fijas las clases Numeros y Estrellas vienen siendo muy similares a TreeSet y HashSet por lo que podemos decir que no son estrictamente necesarias. No obstante es positivo que hayas hecho un diseño así porque demuestras que sabes definir clases y trabajar con objetos.

La clase ConjuntoSet también podemos decir que está bien planteada. En esta clase hay un problema: el nombre de la clase. Haz puesto como nombre ConjuntoSet y este nombre no es adecuado por un motivo: en Java son dos cosas distintas un conjunto y una lista. Tu clase representa una lista, por lo que el nombre "ConjuntoSet" no es adecuado. Sería preferible ListaSet. Ten en cuenta que en inglé set es conjunto y list lista. En el api de java set y list son dos interfaces y cada una tiene características diferentes y conviene no mezclar la terminología.

La clase GestorIterador está muy bien resuelta, posiblemente una de las mejores soluciones que he visto planteada en los foros, enhorabuena.

Una pequeña mejora sería separar las líneas (simplemente he introducido un salto de línea):

Código: [Seleccionar]
import java.util.Iterator;
import java.util.Set;
public class GestorIterador {
    public static void main (String [] args){
        ConjuntoSet prueba = new ConjuntoSet();
        Iterator <Set> iterConjunto = prueba.getConjunto().iterator();
        while(iterConjunto.hasNext()){
            Iterator iterObjetos = iterConjunto.next().iterator();
                System.out.print("Elementos: ");
              while(iterObjetos.hasNext()){
                  System.out.print(iterObjetos.next() + ", "); }
                System.out.println("");
        }
    }
}

También sería posible eliminar la coma final pero eso lo dejamos como ejercicio para quien quiera realizarlo.

Saludos.

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Bueno muchas gracias por tu respuesta lo primero Mario.

Sí tengo clara la diferencia entre Set y List que las dos vienen de Collection. Tendré en cuenta lo de los nombres, ya lo hago pero es obvio que a veces resulta dificil poner uno que explique la clase sintetizada y de forma correcta.

Sí la resolución del GestorIterador es genial, pero no es mía, la cogí a posteriori de otro compañero del foro, el doble Iterador, la mía era solo con uno, aunque al menos sabía que algo me faltaba.

La parte en la que dices has añadido un salto de linea creo se podria resolver simplemente cambiando
 
     while(iterObjetos.hasNext()){
                  System.out.print(iterObjetos.next() + ", "); }

por un System.out.println. en ese caso con coma al final.

También adjunto tu petición de eliminar la coma final con tu println("") y el cambio de la clase ConjuntoSet por ListaSet.

Código: [Seleccionar]
import java.util.Iterator;
import java.util.Set;

public class GestorIterador {
    public static void main (String [] args){
        ListaSet prueba = new ListaSet();
        for( Iterator <Set> iterConjunto = prueba.getLista().iterator(); iterConjunto.hasNext();){
       
            for( Iterator iterObjetos = iterConjunto.next().iterator(); iterObjetos.hasNext();)
            {
                System.out.print(iterObjetos.next());
                // añado esta condición que en el caso de ser falsas las dos no imprime la ultima coma
                if (iterConjunto.hasNext() || iterObjetos.hasNext()){System.out.print(", "); }
                System.out.println("");
             }
             
        }

    }
}







Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Gracias por las aclaraciones. Buen trabajo. Saludos y a seguir...

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
A ti Mario por las molestias que te tomas y la ayuda de todo el equipo que es genial.

 

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