Autor Tema: Ejercicios resueltos polimorfismo en Java definición concepto ejemplo CU00678B  (Leído 481 veces)

nengue

  • Sin experiencia
  • *
  • Mensajes: 9
    • Ver Perfil
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();
        }

    }
}
« Última modificación: 08 de Diciembre 2020, 12:31 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2049
    • Ver Perfil
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

nengue

  • Sin experiencia
  • *
  • Mensajes: 9
    • Ver Perfil
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.
« Última modificación: 24 de Enero 2021, 13:59 por Alex Rodríguez »

 

Esto es un laboratorio de ideas...
Aprender a programar

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