2012-06-25 10 views
13

En Iterator Sun agregó el método de eliminación para eliminar el último elemento al que se accedió de la colección. ¿Por qué no hay un método de agregar para agregar un nuevo elemento a la colección? ¿Qué tipo de efectos secundarios puede tener para la colección o el iterador?por qué no hay un método de agregar en la interfaz del iterador

+0

yo creo que hay una duplicación: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi

+0

@mihaisimi - No, esto es realmente una pregunta diferente –

+0

Sí, tienes razón. Todavía coobird brindó una buena respuesta a esto en ese hilo. – mihaisimi

Respuesta

10

El único propósito de un iterador es enumerar a través de una colección. Todas las colecciones contienen el método add() para cumplir con su propósito. No tendría sentido agregar a un iterador porque la colección puede o no ordenarse (en el caso de HashSet).

EDIT: Mientras trabajaba en otro problema, que se le ocurrió otra razón por la que Iterator carece de un método add(). Mirando bajo el capó de ArrayList (línea 111), y HashMap (línea 149), vemos que la implementación es solo unos pocos métodos que rodean una matriz de objetos. Ahora consideramos cómo se tratan las matrices en la memoria.

zero-based array indexes

Este es un array de 5 elementos. Sin embargo, hay seis índices. La letra "a" en esta matriz se enumera como elemento 0 porque para poder leerla, de izquierda a derecha como lo hace una computadora, debe comenzar en el índice 0. Ahora, si estamos iterando a través de esta matriz (sí, colección, pero se reduce a una matriz), comenzaremos en el índice 0 y continuaremos indexando 1. En este punto en el iterador, queremos llamar al add("f");. En este punto, comparemos las implicaciones de add() y remove(). remove() dejaría un espacio en la matriz, que es fácil de saltar, porque podemos reconocer inmediatamente que no es miembro. Por otro lado, add() pondría un nuevo elemento en el que no estaba allí antes. Esto afectará la longitud de la matriz por la que estamos iterando. ¿Qué pasa cuando llegamos a ese último elemento? ¿Podemos incluso garantizar que está allí (es decir, que la matriz no ha excedido the maximum size)?

En general, los argumentos de una forma u otra tienen puntos válidos, pero la conclusión es que el comportamiento de un método add() no está bien definido en todos los casos. Sun tuvo que elegir dónde limitar la funcionalidad y optó por no incluir este método.

+0

"porque la colección puede o no ordenarse" - por favor, ejecútelo un poco. Gracias – droidsites

+0

Recibí su estado de cuenta :-). Gracias – droidsites

+0

Un HashSet no garantiza el orden de sus miembros. Si está iterando para tratar de encontrar un punto en el que insertar un valor, acaba de derrotar al punto de un iterador. – gobernador

0

No puedo pensar en ninguna razón teórica por la cual add() no pudo haber sido incluido en Iterator. Así como el Iterator puede permitir que los elementos se eliminen de la colección a través de sí mismo, podría diseñarse para manejar los elementos que se agregan de la misma manera.

Pero lo diré en todos mis años de programación en Java: ¡más de 15! - Nunca he querido un método Iterator.add(). Entonces sospecho que simplemente no es tan útil.

5

Si está trabajando en una lista, puede usar ListIterator, que proporciona operaciones de adición y eliminación.

+3

No responde la pregunta en realidad. Pero sí, 'Iterator' no implementa' add' porque no es 'ListIterator'. – Robert

10

bien, aquí vamos:

La respuesta se indica claramente en las preguntas frecuentes de diseño:

¿Por qué no proporcionan un método Iterator.add?

La semántica no es clara, dado que el contrato para Iterator no garantiza el orden de iteración. Sin embargo, tenga en cuenta que ListIterator proporciona una operación de agregar, ya que garantiza el orden de la iteración.

http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10

0

Iterator tienen un puntero al siguiente elemento solamente. donde como ListIterator también tienen punteros al elemento anterior (recuerde, puede atravesar hacia atrás).

Cuestiones relacionadas