Java - Recorrer elementos de un hashtable

   
Vista:

Recorrer elementos de un hashtable

Publicado por William Alexander Brito Viñas (12 intervenciones) el 22/03/2013 20:39:40
He decidido aprender algo de Java y ejercitandome he estado detenido es esto:

Tengo el siguiente codigo que introduce un ciclo infinito y no veo el porque.

import CustomClasses.Student;
import java.util.Hashtable;


public static void main(String[] args) {

Hashtable<String, Student> ht = new Hashtable<String, Student>();
Student[] students = new Student[2];

students[0] = new Student("William", "Brito", 70);
students[1] = new Student("Claudia", "Alvarado", 85);

for(Student s:students) {
ht.put(s.getFullName(), s);
}

float average = 0;
// Here enters in an endless loop
while (ht.elements().hasMoreElements()) {
average += ht.elements().nextElement().getScore();
}
average /= ht.size(); // This code is unreachable. Why?

}

O sea la idea es simple, un hashtable con dos elementos, el problema de ciclar a traves de los elementos puedo hacerlo usando un iterator suministrado por entrySet y de hecho prefiero hacerlo así pero el codigo de arriba que cicla a traves de la enumeracion elements usando HasmoreElements y nextElement debería funcionar, pero en lugar de eso hasMoreElements() siempre devuelve Verdadero y el ciclo no termina.
La pregunta es ¿Por qué?.

Nota: La clase Student es una clase del paquete CustomClasses, cuyo constructor toma el nombre, el apellido y la calificacion. Tiene un metodo que devuelve el nombre completo y hace override del metodo toString(). Los getters y setters de todo lo que se inicializa en el contrsuctor tamiben estan definidos. Es un codigo demaisado simple para ilustrarlo aqui.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Recorrer elementos de un hashtable

Publicado por jose (12 intervenciones) el 23/03/2013 14:43:39
con mis pocos conociemintos d ejava, creo q es por el for, haces referencia a students, y eso no tiene definido un tamaño maximo, por lo que estas poniendo nombbres sin parar, por lo que luego al hacer el has more eements, posee mas de 2 elementos.

no se, a mi me huele algo mal en lo del for, pueba de otr aforma mas sencilla. haciendo referencia a student, no a studens
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Recorrer elementos de un hashtable

Publicado por William Alexander Brito Viñas (12 intervenciones) el 23/03/2013 16:35:17
El ciclo for (encargado de meter los elementos desde el ArrayList al Hashtable) funciona bien o al menos eso parece debido a dos razones:

1- En estas lineas no es donde se produce el ciclo infinito. Es en el while.
2- Al salir del ciclo for htSutdent.size devuelve 2.

Sigo sin saber el por qué
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Recorrer elementos de un hashtable

Publicado por jose (12 intervenciones) el 23/03/2013 20:58:27
a ver si eso te ayuda.

http://lineadecodigo.com/tag/hasmoreelements/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Recorrer elementos de un hashtable

Publicado por William Alexander Brito (12 intervenciones) el 24/03/2013 00:04:53
Ahora si comprendí y es sutil:

Esto no funciona, se produce el lazo infinito.
1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
       Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
 
       ht.put("Uno", new Integer(1));
       ht.put("Dos", new Integer(2));
       ht.put("Tres", new Integer(3));
 
       while(ht.elements().hasMoreElements()) {
           System.out.print(ht.elements().nextElement());
           System.out.println();
       }
}


Si embargo, este de aqui sí funciona.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
       Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
 
       ht.put("Uno", new Integer(1));
       ht.put("Dos", new Integer(2));
       ht.put("Tres", new Integer(3));
 
       Enumeration<Integer> elements = ht.elements();
 
       while(elements.hasMoreElements()) {
           System.out.print(Integer element = elements.nextElement());
           System.out.println();
       }
}


El metodo getElements() de la clase Hashtable construye y devuelve una nueva enumeracion que contiene toods los elementos del hashtable en el orden inverso en que fueron metidos. Ahí estaba todo el problema. Gracias por el link.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Recorrer elementos de un hashtable

Publicado por jose (12 intervenciones) el 24/03/2013 16:13:50
de nada, cuesta poco ayudar en lo q se pueda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar