Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Lorenzo31 en 05 de Mayo 2015, 23:47
-
Buenas noches, quería consultar este tema, primero porque por su complejidad me gustó pero a la vez me dejo dudas.
https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=589:interface-iterable-y-metodo-iterator-api-java-recorrer-colecciones-ejercicio-y-ejemplo-resuelto-cu00912c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180 (https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=589:interface-iterable-y-metodo-iterator-api-java-recorrer-colecciones-ejercicio-y-ejemplo-resuelto-cu00912c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180)
La primera es, que diferencia hay entre usar el import java.util.Iterator; y invocar el metodo iterator() como haciamos siempre en el curso "java desde cero" y implementar la Interface Iterable y Iterator.
La respuesta es que permite un trato mas "personalizado" de los metodos next() hasNext()... ? es lo que se me ocurre a botepronto.
Después he observado que en el for-each interviene tambien la Interface Iterator.
Hay algun ejercicio que pueda realizar para practicar este tema ? o documentación adicional clarificadora que alguien sepa que hay por la red?
Gracias de antemano como siempre. Es un tema que me ha dejado un poco el culo torcio, no por no entenderlo sino porque es complejo de replicar y saber cuando usarlo.
-
Hola Lorenzo
La primera es, que diferencia hay entre usar el import java.util.Iterator; y invocar el metodo iterator() como haciamos siempre en el curso "java desde cero" y implementar la Interface Iterable y Iterator.
La respuesta es que permite un trato mas "personalizado" de los metodos next() hasNext()... ? es lo que se me ocurre a bote pronto.
El motivo por el que implementar estas interfaces es que si es una clase que has creado tú no vas a poder recorrerlas con iterator porque iterator sólo está disponibles en las clases del api Java. Entonces, ¿cómo crear colecciones definidas por nosotros como programadores y permitir que sean recorridas? Implementando estas interfaces. ¿Y si no las implementamos y hacemos el recorrido de otra manera? No estaremos siguiendo la convención de todos los programadores, y si no la seguimos nos echarán de la empresa (si es que estamos en una empresa) por malos ;)
Después he observado que en el for-each interviene tambien la Interface Iterator.
Esto no entiendo muy bien a qué te refieres ¿a qué te refieres?
Saludos
-
Buenas, entendido el tema de hacerlas Iterable porque no lo son, solo las de la libreria Java. Ok y hasta ahora solo hemos invocado a Iterator sobre ArrayList o clases ya definias.
Sobre el for-each , en ese mismo ejercicio, puse un stop y cada vez que entraba en el bucle for each se iba (o eso me pareció a mi) al hasNext() que habia creado en la otra clase que implementaba Iterator. Al menos eso me pareció igual no es asi.
P.D. aun me baila un poco el tema. Hay que asimilarlo en practica ;)
-
Sobre el for-each , en ese mismo ejercicio, puse un stop y cada vez que entraba en el bucle for each se iba (o eso me pareció a mi) al hasNext() que habia creado en la otra clase que implementaba Iterator. Al menos eso me pareció igual no es asi.
Hola, yo no le veo relación, creo que más bien sea algo que se haya mezclado sin querer, aunque voy a :-X por si acaso
Saludos
-
Será como tu dices, un error mio al observarlo. ::)
-
Hola!
Estuve haciendo la prueba de ver qué sucedía cuando usamos el for-each para recorrer un objeto tipo ConjuntoPersonas, y es cierto lo que dice Lorenzo31.
Si corremos paso-por-paso el código Programa nos damos cuenta que al entrar en la instrucción for (del for-each) se llama al método iterator() de la clase ConjuntoPersonas.
Por lo tanto for-each utiliza el método iterator() de la clase ConjuntoPersonas, de la misma manera que si utilizáramos un iterador sobre el objeto ConjuntoPersonas y luego llamáramos a sus métodos hasNext() y Next().
Es decir, que la utilización de los métodos declarados en la clase concreta MiIteratorPersona (que son los métodos que estamos obligados a implementar de la interface Iterator) son utilizados de la misma manera tanto al hacer en nuestro código Programa:
Iterator<Persona> it1 = cp.iterator();
while (it1.hasNext()){
Persona tmp = it1.next();
System.out.println("La persona:"+tmp.dni+" tiene una edad de:"+tmp.edad);
}
como si hiciéramos :
for (Persona p : cp) // Esto es un for extendido o for-each{
System.out.println("La persona:"+p.dni+" tiene una edad de:"+p.edad);
}
Es como si (y por favor que se tome bien el entrecomillado) "el for-each fuese una máscara del iterador", ambas cosas funcionalmente hacen lo mismo.
Otro dato importante que va en el mismo sentido: no podríamos usar for-each para un objeto tipo ConjuntoPersonas si ConjuntoPersonas no implementara la interfaz Iterable.
Una forma simple de hacer saltar esto sería: haciendo un cambio en una línea de la clase ConjuntoPersonas:
public class ConjuntoPersonas implements Iterable<Persona>{
por:
public class ConjuntoPersonas {
(y si ningún otro cambio más en el código). Al compilar la clase Persona nos da un error de compilación en el for-each con la siguiente leyenda:
for-each not applicable to expression type
required: array or java.lang.Iterable; found: ConjuntoPersonas
-
Buenas, así que lo que observé no era cosa mia, jeje
Bueno no le di mayor importancia, porque creo que no es una copia, es un "iterador" en el sentido de la forma en la que se mueve, hasNext y next todo el rato, pero no por ello es una copia, de echo, si eliminas algun objeto que tenga vinculos con otros, salta error por corromperlos. Creo que simplemente tiene que ver con el funcionamiento que te comento, pero alguien que sepa más puede indicarlo mejor es una sensación logica :)