Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: nengue en 03 de Diciembre 2020, 12:56

Título: Ejercicios resueltos polimorfismo en Java definición concepto ejemplo CU00678B
Publicado por: nengue en 03 de Diciembre 2020, 12:56
Buenas de nuevo,pongo aquí el código del ejercicio CU00678B del manual de programación java desde cero. Tengo que decir que me ha costado entender el concepto de Interface, y más que nada su función porque en un principio, parece que no aporta nada, y será un concepto que tendré que revisar nuevamente. Sin más dilaciones,dejo mi propuesta de resolución al ejercicio citado .


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

/**
 * CU00678B
 *  La interface Set de Java es implementada por las clases HashSet y TreeSet.
 *  Busca información sobre estas clases en la documentación del api Java.
 *  Crea un programa Java que haga lo siguiente:
 *  a) Declarar un ArrayList de objetos de tipo Set.
 *  b) Crear un objeto de tipo HashSet para contener Strings y haz que contenga las cadenas “sol”, “luna”, “saturno”.
 *  c) Crear un objeto TreeSet para contener Integers y haz que contenga los números 2, 8, 5.
 *  d) Añade los objetos HashSet y TreeSet como elementos del ArrayList.
 *  e) Usa iteradores para recorrer los elementos del ArrayList y recorrer el contenido de cada uno de los
 *  elementos y mostrar este contenido por pantalla. Por pantalla deberás obtener “sol”, “luna”, “saturno”, 8, 5, 2.
 */

public class CU00678B{
    public static void main (String[] args){

        ArrayList<Set> miLista;     //Una lista que contiene objetos de tipo Set(HashSet,TreeSet,EnumSet,etc)
        HashSet<String> lista1;     //Coleccion de elementos no duplicados respaldados por una tabla de hash
        TreeSet<Integer> lista2;    //una coleccion de elementos no duplicados basada en TreeMap

        lista1 = new HashSet<String>();//añadiendo objetos tipo String (cadena de texto) al HashSet;
        lista1.add("sol");
        lista1.add("Luna");
        lista1.add("Saturno");

        lista2 = new TreeSet<Integer>();//Añadiendo objetos tipo Integer(int no es objeto) al Set
        lista2.add(2);
        lista2.add(8);
        lista2.add(5);

        miLista = new ArrayList<Set>();//añadiendo HashSet y Set a mi ArrayList(lo puedo hacer por indicar un tipo y no una clase)
        miLista.add(lista1);
        miLista.add(lista2);

        Iterator<Set> listaIterada = miLista.iterator();    //creando iterador para miLista ArrayList<set>
        Iterator<String> lista1Iterada = lista1.iterator(); //creando iterador para lista1 HashSet<String>
        Iterator<Integer> lista2Iterada = lista2.iterator();//creando iterador para lista2 TreeSet<Integer>
     
        //recorro con un iterador mi HashSet y mi Set ,contenidos en un Arraylist ,recorrido a su vez a traves de un iterador
        while(listaIterada.hasNext()){
            while(lista1Iterada.hasNext()){
                System.out.print(lista1Iterada.next() + "," );
            }
            while(lista2Iterada.hasNext()){
                System.out.print(lista2Iterada.next());
                if (lista2Iterada.hasNext())
                {
                    System.out.print(",");
                   
                }
            }
            listaIterada.next();
        }

    }
}
Título: Re: Ejercicios resueltos polimorfismo en Java definición concepto ejemplo CU00678B
Publicado por: Alex Rodríguez en 08 de Diciembre 2020, 12:33
Hola, el concepto de interface puede ser un poco difícil de captar al principio. Básicamente lo que hace una interface es definir cómo va a ser una clase en cuanto a cosas que debe cumplir, pero sin especificar el código concreto con el que va a cumplirse eso. Luego puede haber varias clases que cumplan (implementen) la interfaz de distintas maneras en cuanto al código concreto, pero los nombres y parámetros de los métodos definidos por la interfaz tendrán que incluirlos en todo caso. De todas formas este concepto de interface se estudia con más detalle más adelante en el curso, casi al final, por lo que ahora es suficiente con quedarse con la idea.

Respecto al ejercicio el código lo veo bastante bien planteado. Comentar algunas cosas:

- Set se traduce como conjunto y es una interface Java, mientras que List es otra interface Java distinta. Por eso no es lo más adecuado usar nombres para sets de tipo lista1 porque puede confundir. Por ejemplo en lugar de HashSet<String> lista1; sería mejor HashSet<String> conjunto1; ó HashSet<String> miSet1; para no confundir sets con lists.

- En la parte de recorridos con iteradores, creas un iterador para el ArrayList de Set y lo invocas, pero realmente no llegas a usarlo. Es un código "que está pero no se usa", por lo que no es útil. En concreto si comento varias líneas del código, el resultado que obtengo es el mismo porque realmente los iteradores que usas son sólo los del HashSet y los del TreeSet. Aquí el fragmento de código con las líneas comentadas:

Código: [Seleccionar]
        //Iterator<Set> listaIterada = miLista.iterator();    //creando iterador para miLista ArrayList<set>
        Iterator<String> lista1Iterada = lista1.iterator(); //creando iterador para lista1 HashSet<String>
        Iterator<Integer> lista2Iterada = lista2.iterator();//creando iterador para lista2 TreeSet<Integer>
     
        //recorro con un iterador mi HashSet y mi Set ,contenidos en un Arraylist ,recorrido a su vez a traves de un iterador
        //while(listaIterada.hasNext()){
            while(lista1Iterada.hasNext()){
                System.out.print(lista1Iterada.next() + "," );
            }
            while(lista2Iterada.hasNext()){
                System.out.print(lista2Iterada.next());
                if (lista2Iterada.hasNext())
                {
                    System.out.print(",");
                   
                }
            }
            //listaIterada.next();
        //}


Podría hacerse uso del iterador del ArrayList así:

Código: [Seleccionar]
        Iterator<Set> listaIterada = miLista.iterator();    //creando iterador para miLista ArrayList<set>
        Iterator<String> lista1Iterada = lista1.iterator(); //creando iterador para lista1 HashSet<String>
        Iterator<Integer> lista2Iterada = lista2.iterator();//creando iterador para lista2 TreeSet<Integer>
     
        //recorro con un iterador mi HashSet y mi Set ,contenidos en un Arraylist ,recorrido a su vez a traves de un iterador
        while(listaIterada.hasNext()){
            System.out.println("Elemento del ArrayList de Set: "+listaIterada.next());
        }
            while(lista1Iterada.hasNext()){
                System.out.print(lista1Iterada.next() + "," );
            }
            while(lista2Iterada.hasNext()){
                System.out.print(lista2Iterada.next());
                if (lista2Iterada.hasNext())
                {
                    System.out.print(",");
                   
                }
            }


En cualquier caso creo que puede darse el ejercicio por bueno.

Si se quiere ver una solución donde se recorren los elementos del ArrayList, y para cada uno se recorren sus elementos, puede encontrarse en https://aprenderaprogramar.com/foros/index.php?topic=2384.0 donde el bucle se plantea básicamente así:

Código: [Seleccionar]
        while (it1.hasNext()) {
            Set tmp = it1.next();
            Iterator it2=tmp.iterator();
            int i = 0;                               
            while(it2.hasNext()){
                System.out.println("i: " + (i++) + " - " + it2.next());
            }
        }

Correspondiendo el it1 al ArrayList de Set y por cada elemento extraído se crea un iterador it2 dentro del bucle. it1 nos devuelve objetos Set mientras que it2 nos puede devolver bien String bien Integer. Por eso para it2 si no declaramos el tipo, se maneja lo que devuelve como si elementos del supertipo Object.

Saludos
Título: Re: Ejercicios resueltos polimorfismo en Java definición concepto ejemplo CU00678B
Publicado por: nengue en 08 de Diciembre 2020, 13:15
Citar
- Set se traduce como conjunto y es una interface Java, mientras que List es otra interface Java distinta. Por eso no es lo más adecuado usar nombres para sets de tipo lista1 porque puede confundir. Por ejemplo en lugar de HashSet<String> lista1; sería mejor HashSet<String> conjunto1; ó HashSet<String> miSet1; para no confundir sets con lists.
Exelente aporte Alex,no me di cuenta que podria dar lugar a confusion y es bien cierto, a tener en cuenta de ahora en adelante

El resto de comentarios los voy a revisar y tambien la recomendación que dejaste. Muchas gracias por tu tomarte tu tiempo en verificar y corregir mi ejercicio.