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
Respuesta
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.
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.
"porque la colección puede o no ordenarse" - por favor, ejecútelo un poco. Gracias – droidsites
Recibí su estado de cuenta :-). Gracias – droidsites
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
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.
Si está trabajando en una lista, puede usar ListIterator, que proporciona operaciones de adición y eliminación.
No responde la pregunta en realidad. Pero sí, 'Iterator' no implementa' add' porque no es 'ListIterator'. – Robert
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
Iterator tienen un puntero al siguiente elemento solamente. donde como ListIterator también tienen punteros al elemento anterior (recuerde, puede atravesar hacia atrás).
- 1. por qué no hay un método de eliminación en HttpWebResponse
- 2. ¿Por qué el iterador no tiene ningún método de reinicio?
- 3. ¿Por qué no hay un método Convert.toFloat()?
- 4. ¿Por qué no hay una interfaz "configurada" en .NET Framework?
- 5. ¿Por qué no hay interfaz Hashable en Java
- 6. ¿Por qué no hay un método getContentView() para la actividad?
- 7. ¿Por qué no hay método Service.onStop?
- 8. ¿Por qué no puedo convertir un iterador inverso en un iterador directo?
- 9. ¿Por qué no hay una interfaz "Iterable" en el STL?
- 10. Agregar método extra a la interfaz
- 11. ¿Por qué un método prefijado con el nombre de la interfaz no se compila en C#?
- 12. ¿Por qué hay un método iterator() en java.util.Collection
- 13. iterador método siguiente
- 14. ¿Por qué la interfaz java.util.Set <V> no proporciona un método get (Object o)?
- 15. ¿La inicialización del iterador dentro del bucle se considera un estilo incorrecto, y por qué?
- 16. ¿Por qué UtteranceProgressListener no es una interfaz?
- 17. Java: ¿por qué no puede iterar sobre un iterador?
- 18. ¿Por qué no hay un documento.createHTMLNode()?
- 19. ¿Por qué no hay Dictionary.TrimExcess()?
- 20. razón por la interfaz no puede tener método miembro estático
- 21. método estático no puede implementar el método de interfaz, ¿por qué?
- 22. ¿por qué no se reemplazó el método() definido en la interfaz Establecer?
- 23. ¿Hay un iterador modificable en Java?
- 24. ¿Cómo se define un tipo de interfaz de iterador?
- 25. ¿Hay alguna razón por la que no pueda definir el modificador de acceso en un método o en una interfaz?
- 26. ¿Por qué necesito la interfaz?
- 27. ¿Por qué no hay un String # shift()?
- 28. ¿por qué no hay un método Center() para la clase Rectangle en C#?
- 29. uso del método equals() en la interfaz del comparador?
- 30. ¿Por qué no hay un método Linq para devolver valores distintos por un predicado?
yo creo que hay una duplicación: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi
@mihaisimi - No, esto es realmente una pregunta diferente –
Sí, tienes razón. Todavía coobird brindó una buena respuesta a esto en ese hilo. – mihaisimi