Iterator Java

kraneok

Hola, os pego este código y posteriormente lanzo la pregunta

@Override
    public void run()
    {
        String dReceive = "";
        while(sr.getStateServer())
        {
            Iterator i = al.iterator();
            while(i.hasNext())
            {
                Client c = (Client) i.next();
                System.out.println(c.getName());
                
} } }

Como veis estoy usando un Iterator dentro de un while, y otro while para recorrer los elementos que tenga dicho ArrayList.
Yo creía que, cuando el iterator terminase de recorrer el ArrayList, creando una nueva instancia, me crearía una copia nueva del ArrayList al que está recorriendo, no lo hace xd.

¿Como puedo solucionar este problema?

Un saludo.

MTX_Anubis

O lo explicas mejor o sino es imposible ayudarte. Cada vez que llamas a iterator() en una lista, te devuelve un Iterador apuntando a su primer elemento.

No estaría mal que declararas tu lista como List<Client> y el iterator como Iterator<Client>

kraneok

El List tiene como parámetro Client, el Iterator no, lo pondré ya que lo has dicho.

A ver, el problema es que quiero saber si cada vez que termino de recorrer el ArrayList con el Iterator, al volver declararlo de nuevo(ya que getStateServer aún me devuelve un true), si la Collection que le paso al List es modificada, el Iterator usa la Collection ya modificada o no.

No se si me explico xdd.

1 respuesta
elkaoD

#3 sí, cada vez que llamar a iterator comienza desde el principio.

PD: USA FOR EACHS, los iteradores son muy 2004.

@Override
public void run() {
    String dReceive = "";
    while(sr.getStateServer()) {
        for (Client c: al) {
            System.out.println(c.getName());  
} }
}
2 respuestas
Lecherito

Yo usaría lo que te ha dicho #4, pero creo que a dimensiones más o menos grandes, el for each se queda algo "lento", si tienes el ArrayList incluso puedes acceder a la lista por índices y con .size() tener lo que necesitas.

2 respuestas
kraneok

#4 Vale gracias, entonces el problema que tengo no viene de esto xddd.

elkaoD

#5 el foreach detrás tiene un iterator. No es más que syntactic sugar... Y un iterador SIEMPRE va a ser más rápido que acceder a los elementos uno a uno.

Si quieres recorrer la colección linealmente, no hay alternativa mejor que foreach.

1 1 respuesta
kraneok

#5 y #7, la cosa es que estoy haciendo un chat en Java en arquitectura Cliente-Servidor.
La idea es ( es mi forma de verlo, estaré equivocado, puede ser ), el servidor tiene una clase que hereda de Thread, y esta lo que hace continuamente es recorrer la Collection de Clients que tengo, de esta clase Client saco su Socket, y del Socket creo un ObjectInputStream, extraigo el texto y lo mando por una tubería hacia el consumidor.
El consumidor recibe un texto y de nuevo, este recorre todos los Client del Collection, extrae el Socket de cada uno, y de cada Socket extraígo el ObjectOutputStream, y envío por aqui el texto a todos los clientes.

¿ Es mala idea ?, ¿ de que forma lo haríais ?

Un saludo.

Usuarios habituales

  • kraneok
  • elkaoD
  • Lecherito
  • MTX_Anubis