Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: fedegaray en 18 de Abril 2015, 18:16

Título: Ejercicio resuelto polimorfismo en java CU00678B# - Set, HashSet y TreeSet
Publicado por: fedegaray en 18 de Abril 2015, 18:16
Citar
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.

Aquí va mi resolución del ejercicio. Que tengan todos un buen día!

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

public class TrabajarConSet {
   
    public static void main (String [] args) {
        System.out.println ("\f");
        ArrayList<Set> miListaDeSets = new ArrayList<Set>();
        HashSet<String> miListaDeStrings = new HashSet<String>();
        miListaDeStrings.add("sol");
        miListaDeStrings.add("luna");
        miListaDeStrings.add("saturno");
        TreeSet<Integer> miListaDeIntegers = new TreeSet<Integer>();
        miListaDeIntegers.add(2);
        miListaDeIntegers.add(8);
        miListaDeIntegers.add(5);
        miListaDeSets.add(miListaDeStrings);
        miListaDeSets.add(miListaDeIntegers);
        Iterator<Set> it = miListaDeSets.iterator();
        while (it.hasNext()) {
            System.out.println (it.next());
        }
    }
}
Título: Re:Ejercicio resuelto polimorfismo en java CU00678B - Set, HashSet y TreeSet
Publicado por: javi in the sky en 20 de Abril 2015, 10:23
Hola fedegaray, tu código está bien.

En el bucle

      while (it.hasNext()) {
            System.out.println (it.next());
        }

Lo que haces es mostrar los objetos completos por pantalla, en este caso es Java quien se encarga de mostrar el objeto. Pero no estás recorriendo cada uno de los elementos que contienen los objetos. A modo de ejercicio, sería interesante que probaras a recorrer cada uno de los elementos y mostrar cada elemento por separado.

Esto sería un ejemplo

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

public class TestPolimorfismo
{
    public static void main(String[]args){
        List<Set>miLista=new ArrayList<Set>();
        Set<String>miConjuntoDeStrings=new HashSet<String>();
        Set<Integer>miConjuntoDeIntegers=new TreeSet<Integer>();

        miConjuntoDeStrings.add("luna");
        miConjuntoDeStrings.add("sol");
        miConjuntoDeStrings.add("saturno");

        miConjuntoDeIntegers.add(2);
        miConjuntoDeIntegers.add(8);
        miConjuntoDeIntegers.add(5);

        miLista.add(miConjuntoDeStrings);
        miLista.add(miConjuntoDeIntegers);

        Iterator it1 = miLista.iterator();
       
        while (it1.hasNext()) {
            Set tmp = (Set)it1.next();
            Iterator it2=tmp.iterator();
            if(tmp instanceof HashSet) {
                System.out.println("Elementos del HashSet.");
            } else {
                System.out.println("Elementos del TreeSet.");
            }
            int i = 0;                               
            while(it2.hasNext()){
                System.out.println("i: " + (i++) + " - " + it2.next());
            }
        }
    }
}

Otra opción, para evitar tener que hacer el casting Set tmp = (Set)it1.next(); sería declarar el tipo que devuelve el iterator así:

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

Declarándolo así el iterador es sobre Set, mientras que de la otra manera es sobre Object y de ahí que haga falta el casting.