2011-10-07 21 views

Respuesta

32

¿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.

+6

(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

+0

@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

+1

@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

3

¡La mejor manera es crear una nueva!

+1

de la misma manera que ha creado la anterior: Iterator iterador = iteratable.iterator(); –

6

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.

3

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.

+0

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

+0

... 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

2

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 
Cuestiones relacionadas