2012-06-21 17 views
5

Voy a utilizar un iterador para recorrer una colección de objetos en Java. Sin embargo, estoy un poco confundido sobre el uso de un Iterador (acostumbrado a usar para cada ciclo). digamos que tengo un código como este:Al iterar sobre colecciones de objetos Java, ¿cómo puedo mutar el objeto actual?

Iterator<Organization> orgIter = orgs.iterator(); 
while (orgIter.hasNext()) { 
    Organization orgObj = orgIter.next(); 
    orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, new ArrayList<Organization>())); 
} 

Creo un objeto nuevo y luego cambio los campos dentro del objeto. Mi plan era establecer el objeto original que formé en el iteroter igual a una lista de este objeto que creo (la lista no se muestra arriba, pero descubrí que la necesitaría).

Pero sería mucho más fácil si no tuviera que crear un nuevo objeto para hacer todo esto. ¿Hay alguna forma de que pueda obtener el objeto actual y mutar eso?

+0

Su redacción es confusa .... su código es funcionalmente idéntica a la respuesta aceptada. En ambos casos, los únicos objetos que se crean son los ArrayLists, y esos serían distintos para cada instancia de organización. ¡Este es el camino a seguir! –

+1

Estoy confundido, estoy creando un objeto Organización y configurándolo igual a la próxima iteración. Supongo que como esa es una variable de referencia, sigo mutando el mismo objeto de memoria física ... – SoftwareSavant

+0

Hay una diferencia entre declarar una variable y crear un objeto. –

Respuesta

4

Prueba esto:

for(Organization org : orgs) 
    org.setChildOrgsTree(generateOrgChildTree(org, new ArrayList<Organization>()); 
+0

+1 Este es el camino a seguir. Utilice un bucle foreach, porque no está modificando 'orgs', simplemente modificando los elementos * de *' org'. – Bohemian

+0

Supongo que es lo que debería hacer ... Intentaba expandir mi repotoire un poco, pero lo mejor era hacer lo que podía. – SoftwareSavant

3

Si su iterador repite una instancia de List o Queue, entonces hay menos restricciones. Siempre que no cambie la estructura de la lista, puede hacer lo que desee con el objeto devuelto por Iterator.next(). Por supuesto, la clase de ese objeto específico debería permitir su modificación, pero supongo que puede agregar el código necesario ...

Por otro lado, la única modificación de estructura de lista que está permitida sin invalidar el iterador objeto, es eliminar el elemento actual usando Iterator.remove(), que, dicho sea de paso, es una operación opcional. Si intenta modificar la lista directamente, el iterador quedará invalidado y obtendrá un ConcurrentModificationException la próxima vez que intente usarlo.

Además, si está iterando sobre un Set, generalmente está mucho más limitado: dependiendo de los detalles de la implementación real Set, generalmente no puede modificar campos arbitrarios en sus objetos. Por ejemplo, el valor devuelto por hashCode() no debe cambiar una vez que un objeto se ha insertado en un HashSet ...

Como comentario, for-each bucles en Java son simplemente azúcar sintáctica para el uso de un Iterator. Si no va a utilizar Iterator.remove(), simplemente use un bucle for-each en lugar del iterador explicity y termine con él.

+0

No dijo que tenía una 'Lista' (solo que tenía una' Colección'), y cambiar un objeto que has almacenado en 'Conjunto' es muy malo si cambias un campo que se usa en el cómputo 'hashCode' (cuando se usa' HashSet') o el cómputo 'Comparable' (cuando se usa' TreeSet'). Hacerlo rompería la semántica 'Set', ya que el valor ya no podría ubicarse en el conjunto. –

+0

@MarkPeters: de acuerdo, supuse que el OP estaba usando una lista, ya que la palabra 'conjunto 'no está en la pregunta. Actualizaré mi respuesta ... – thkala

Cuestiones relacionadas