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:
//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í:
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í:
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