¿Por qué? ¿Y cuál es la mejor manera de mover el puntero de los elementos del iterador a la primera posición?¿Por qué el iterador no tiene ningún método de reinicio?
Respuesta
¿Por qué?
Porque si forzar iterador tener un método de restablecimiento cada iterador tiene que tener un método de restablecimiento. Eso le da a cada escritor iterador trabajo adicional. Además, algunos iteradores son realmente difíciles (o realmente caros) de reiniciar, y no le gustaría que los usuarios llamaran a reiniciar en ellos. Iteradores sobre archivos o secuencias son buenos ejemplos.
¿cuál es la mejor manera de mover el puntero de los elementos del iterador a la primera posición?
Crea un iterador nuevo. Raramente es más caro que el reinicio.
¡La mejor manera es crear una nueva!
de la misma manera que ha creado la anterior: Iterator iterador =
Una vez que lea una secuencia, no podrá volver a leerla sin volver a abrir la fuente. Así es como funcionan las secuencias y los iteradores.
Esta es una tendencia general adoptada en JCF: mantenga la interfaz minimalista, a menos que eso haga que alguna característica sea extremadamente difícil de trabajar. Esta es la razón por la que no tiene interfaces separadas para semántica como colecciones inmutables, colecciones de tamaño fijo ...
Por qué entonces se proporciona un remove(Object)
(como opcional) - No proporcionar esto haría que sea imposible eliminar de forma segura un elemento de una colección mientras se itera sobre la colección; no hay nada que haga que proporcionar un reset()
sea tan obligatorio.
Una vez más, por qué hay una separados ListIterator()
(proporcionando métodos como previous()
y previousIndex()
) - con una interfaz List
, la funcionalidad principal mientras está siendo utilizado es la capacidad a la disposición de los elementos WRT un índice, y para ser capaz de acceda a ellos con un orden de índice, ya sea de orden fijo o aleatorio. Este no es el caso con otras colecciones. No proporcionar esta interfaz para un List
hará que sea muy difícil, si no imposible, trabajar sin problemas con una lista.
Hay algunas cosas que se pueden hacer con casi cualquier 'Iteratable' y' Iterator', que podrían haberse incluido de manera útil en la interfaz pero que no lo estaban. Los métodos de iterador útiles incluirían 'skip' [equivalente a N llamadas de movimiento consecutivas, aunque muchos iteradores podrían implementarlo en el tiempo O (1)] y' copyLocation' [que devolvería un iterador que se espera que produzca los mismos elementos que el original ] Cualquier iterador podría implementar un método 'skip', y cualquier iterador finito no grande podría implementar' copyLocation' al enumerarse a una matriz, y luego tener tanto la misma como la copia ... – supercat
... devolver elementos de esa matriz. El código del cliente podría realizar cualquiera de las operaciones en sí, pero si un iterador tiene un conocimiento especial sobre su funcionamiento interno que el código del cliente no tiene, podría usar ese conocimiento para ofrecer mejoras de velocidad de muchos órdenes de magnitud. – supercat
Consejo: en su lugar, cree su variable de iterador como una función, luego puede consumirla tantas veces como desee. Esto solo funciona si la lógica subyacente es repetible.
Ejemplo de Scala (Java similar, pero que no tienen un REPL práctica desarrollada en Java)
def i = (1 to 100) iterator // i is our iterator
i.grouped(50) foreach println // prints two groups
i.grouped(50) foreach println // prints same two groups again
- 1. ¿Por qué el .htaccess no tiene ningún efecto?
- 2. ¿Por qué Java no tiene ningún destructor como C++?
- 3. ¿Por qué StringBuilder no tiene el método IndexOf?
- 4. ¿Por qué el lenguaje Python no tiene un método writeln()?
- 5. Uncaught TypeError: Object [objeto Object] no tiene ningún método 'apply'
- 6. TypeError HTMLSpanElement tiene ningún método 'html'
- 7. jQuery Tránsito: Objeto no tiene ningún método 'setFromString'
- 8. ¡El proyecto no tiene ningún archivo default.properties!
- 9. El iterador incorporado para PriorityQueue de java no atraviesa la estructura de datos en ningún orden en particular. ¿Por qué?
- 10. objeto no tiene ningún atributo 'guardar' Django
- 11. ¿Por qué XElement no tiene un método GetAttributeValue?
- 12. ¿Por qué ObservableCollection no tiene un método RemoveAll?
- 13. less.js tiene ningún método 'toCSS' en el reloj
- 14. ¿Por qué java.io.File no tiene un método close()?
- 15. ¿Por qué no hay ningún algoritmo std :: copy_if?
- 16. ¿Por qué el tipo de cadena tiene un método .ToString()?
- 17. Python AttributeError: El objeto no tiene ningún atributo
- 18. shell interactivo php no tiene ningún resultado?
- 19. Configuración de cell.ReadOnly no tiene ningún efecto
- 20. iterador método siguiente
- 21. Python PIL no tiene ningún atributo 'Imagen'
- 22. Establecer NSFileCreationDate no tiene ningún efecto
- 23. ¿Cerrar un ByteArrayOutputStream no tiene ningún efecto?
- 24. VIM textwidth no tiene ningún efecto
- 25. por qué no hay un método de agregar en la interfaz del iterador
- 26. NSAttributedString kCTParagraphStyleSpecifierParagraphSpacing no tiene ningún efecto
- 27. ¿Por qué la propiedad '#weight' a veces no tiene ningún efecto en los formularios de Drupal?
- 28. El objeto no tiene el método 'reemplazar'
- 29. ¿Por qué Python no tiene variables estáticas?
- 30. ¿Por qué verificar self! = Nil in -init cuando el envío de mensajes nulo no tiene ningún efecto?
(Excepto el hecho de que hay un método 'eliminar', que * no * realmente realmente da "trabajo extra" a todos los iteradores, ya que la operación es opcional.) – aioobe
@aioobe Hay algunos casos en los que se elimina el objeto actual iterator hace la vida realmente fácil para los desarrolladores. Hay muy pocos casos en que esto sea cierto para el restablecimiento (porque casi siempre puede crear un nuevo iterador). – DJClayworth
@DJClayworth "Eso le da a cada escritor iterador un trabajo extra". Esa no es una respuesta razonable. Los implementadores de la biblioteca necesitan hacer un pequeño esfuerzo adicional, pero la recompensa es que muchos usuarios de la biblioteca obtendrán el beneficio. – stackoverflowuser2010