Consulta notas del vídeo y pseudocódigos adicionales en www.makigas.es/v/0jfclzSqsVk Aprende más patrones y principios en www.makigas.es/videos?tag=patrones Pregunta cualquier duda que tengas en los comentarios o en foro.makigas.es
Gracias por vídeo Makigas, muy interesante. Dos cosas que me han pasado manejando iteradores. La primera es que una vez que llames a next() si sabes que vas a necesitar ese valor en el futuro, debes guardarlo en una variable ya que si usas next() de nuevo para consultar su valor, este ya no será next() sino next() x2. Segundo, no conozco forma de mover hacia atrás el cursor del iterador, es decir, si mientras iteras una colección quieres volver al principio de la colección la única forma que conozco es volver a declarar el iterador. Supongo que como todo en la vida, tiene sus cosas buenas y sus cosas no tan buenas. Saludos
Así es, una de las desventajas de los iteradores es que solo van hacia adelante salvo que la implementación tenga algo especial que lo soporte, pero lo único que es obligatorio es el salto adelante. Lo del next() cuadra con como funciona, cada vez que se le llama pasa al siguiente, nunca devuelve dos veces lo mismo. Hay que ir dejando los elementos por ahí.
Y luego, la diferencia fundamentalmente estaría que el externo te da la referencia al iterador y lo puedes manipular tal cual; el interno no lo tocas, por ejemplo un forEach() solamente pide la función, pero no da la referencia tal cual
Muy buen vídeo. A mi particularmente me queda la duda de , por ejemplo en lenguaje Java, que tipo de operación se hace detrás de bambalinas para que cuando estás mutando una colección a la vez que la recorres con un iterator (mutar la colección como tal, no su contenido, eliminar un elemento mientras la recorres, voy al grano...), que ocurre "under the hood" para que no salte el tipo de excepción que salta cuando la estás recorriendo con una estructura que no sea un iterator 😂... Y como al eliminar un elemento del iterator, dicha operación se replica en la colección como si estuvieran ligadas... No sé si me explico
Diría que la "trampa" está que el iterator de Java tiene en su interfaz un método propio llamado remove() para cuando se quiere borrar, y que por eso sabe cómo tratar un borrado sin que se rompa el iterador.
@@makigas Claro. Igualmente lo tiene la colección, en el caso de Java, una implementación de Lista con ArrayList, por ejemplo, la tiene también. Pero si iteras una colección con un bucle for clásico o incluso un for-each, si intentas eliminar un elemento, salta una excepción de tipo ConcurrentModificationException. Mientras que usando un iterator esto no ocurre. Ahí es donde el cómo lo hace empieza a ser auténtica magia negra para mí (que seguro que tiene una explicación que desconozco y nunca he sabido encontrar)
Consulta notas del vídeo y pseudocódigos adicionales en www.makigas.es/v/0jfclzSqsVk
Aprende más patrones y principios en www.makigas.es/videos?tag=patrones
Pregunta cualquier duda que tengas en los comentarios o en foro.makigas.es
Una clase d Iterador e Algoritmo en el mismo video! Parabéns! 👏🏽👏🏽👏🏽👏🏽
Eaaa, ya salgo en la lista de miembros!!!
Gracias por vídeo Makigas, muy interesante. Dos cosas que me han pasado manejando iteradores. La primera es que una vez que llames a next() si sabes que vas a necesitar ese valor en el futuro, debes guardarlo en una variable ya que si usas next() de nuevo para consultar su valor, este ya no será next() sino next() x2. Segundo, no conozco forma de mover hacia atrás el cursor del iterador, es decir, si mientras iteras una colección quieres volver al principio de la colección la única forma que conozco es volver a declarar el iterador. Supongo que como todo en la vida, tiene sus cosas buenas y sus cosas no tan buenas. Saludos
Así es, una de las desventajas de los iteradores es que solo van hacia adelante salvo que la implementación tenga algo especial que lo soporte, pero lo único que es obligatorio es el salto adelante. Lo del next() cuadra con como funciona, cada vez que se le llama pasa al siguiente, nunca devuelve dos veces lo mismo. Hay que ir dejando los elementos por ahí.
Excelente video, este tipo de iteradores son los llamados externos? Ya sea o no, que diferencia habría en la implementación con iterador interno.
Sí, es el externo
Y luego, la diferencia fundamentalmente estaría que el externo te da la referencia al iterador y lo puedes manipular tal cual; el interno no lo tocas, por ejemplo un forEach() solamente pide la función, pero no da la referencia tal cual
Mu buena explicacion. +1
Muy buen vídeo. A mi particularmente me queda la duda de , por ejemplo en lenguaje Java, que tipo de operación se hace detrás de bambalinas para que cuando estás mutando una colección a la vez que la recorres con un iterator (mutar la colección como tal, no su contenido, eliminar un elemento mientras la recorres, voy al grano...), que ocurre "under the hood" para que no salte el tipo de excepción que salta cuando la estás recorriendo con una estructura que no sea un iterator 😂... Y como al eliminar un elemento del iterator, dicha operación se replica en la colección como si estuvieran ligadas... No sé si me explico
Diría que la "trampa" está que el iterator de Java tiene en su interfaz un método propio llamado remove() para cuando se quiere borrar, y que por eso sabe cómo tratar un borrado sin que se rompa el iterador.
@@makigas
Claro. Igualmente lo tiene la colección, en el caso de Java, una implementación de Lista con ArrayList, por ejemplo, la tiene también. Pero si iteras una colección con un bucle for clásico o incluso un for-each, si intentas eliminar un elemento, salta una excepción de tipo ConcurrentModificationException. Mientras que usando un iterator esto no ocurre. Ahí es donde el cómo lo hace empieza a ser auténtica magia negra para mí (que seguro que tiene una explicación que desconozco y nunca he sabido encontrar)