Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Array JPanelText

Hola a todos, soy nuevo en el mundo de la programación en java y también en el foro. Y escribo este post a ver si alguien me puede echar una mano. He estado analizando el código de un programa que genera seis números aleatorios que no se repiten entre sí y que van del 1 al 50 y me ha surgido una duda leyendo el código. Analizando el código llego a un bucle do while, que es este:

public void itemStateChanged(ItemEvent event) {

Object item = event.getItem();
if (item == gui.automatico) {
for (int i = 0; i < 6; i++) {
int eleccion;
do {
eleccion = (int) Math.floor(Math.random() * 50 + 1);
} while (numeroRepetido(eleccion, gui.numeros, i));
gui.numeros[i].setText("" + eleccion);
}

} else {
for (int i = 0; i < 6; i++) {
gui.numeros[i].setText(null);
}
}
}

El cual me llama al método numeroRepetido y le paso los 3 argumentos que veis.
El método numeroRepetido es este:

boolean numeroRepetido(int num, JTextField[] pastNums, int count) {

for (int i = 0; i < count; i++) {
if (Integer.parseInt(pastNums[i].getText()) == num) {
return true;
}
}
return false;
}

Y lo que no entiendo del todo es la condición del if:

if (Integer.parseInt(pastNums[i].getText()) == num)

Ya que sé que lo que está haciendo es hacer un casting del string que me pasa getText a Integer y me lo está comparando con num, pero lo que no entiendo es como hace esta comparación justo al principio, cuando se genera el primer número de todos y lo va a comparar con pastNums[0], es decir, cuando el array pastNums está totalmente vacío, porque no le he introducido de momento ningún número. Ya que este array lo he iniciado antes pero no le he metido ningún string:

JTextField[] numeros = new JTextField[6];

Y entonces no sé exactamente con que valor está comparando, ya que no sé con que valor se inicia un array del tipo JTextField. Porque he estado buscando por internet y he leído que se inicia con "" y entonces no sé cómo puede hacer el casting a Integer de "".
Si alguien me puede explicar esto me sería de gran ayuda.

marzo 15, 2016 | Registered Commenterjuan91

El primer bloque (cuando el if se cumple) se asegura de que todos los JTextField tengan un valor

if (item == gui.automatico) {
for (int i = 0; i < 6; i++) {
int eleccion;
do {
eleccion = (int) Math.floor(Math.random() * 50 + 1);
} while (numeroRepetido(eleccion, gui.numeros, i));
gui.numeros[i].setText("" + eleccion);
}
} else {
for (int i = 0; i < 6; i++) {
gui.numeros[i].setText(null);
}
}

Si comentas ese bloque sin duda obtendrás una excepción al tratar de convertir a un entero el 1er elemento del Array.

Saludos!!

---
RuGI

marzo 16, 2016 | Registered Commenterrugi

Pues eso es lo que pensaba yo,que al intentar hacer el casting del primer elemento del array la primera vez, me daría un error,pero lo sorprendente es que no y que el programa es totalmente funcional,y eso es lo que me trae de cabeza.

marzo 17, 2016 | Registered Commenterjuan91

Empezando el ciclo for con i=0, abre el do y envia el primer numero (eleccion), el vector de textField(gui.numeros) y el indice( i).
Como i=0 el ciclo for del metodo numeroRepetido no se ejecuta y devuelve false.
el ciclo do se rompe al ser false y se asiga el primer valor (eleccion) en la posicion cero (i) del vector gui.numeros.
i se incrementa a 1, se abre el do y se genera el nuevo numero eleccion. se envia el numero(eleccion), el vector(ahora con un valor) y 1 (i).
El ciclo for del metodo numeroRepetido se ejecuta 1 vez comparando el valor en la posicion cero del vector con el valor enviado num. si son iguales regresa true y el ciclo do no se rompe y obtiene un nuevo numero que nuevamente envia, pero i no ha cambiado, ni el vector. Si ahora regres false es porque el numero es diferente, se rompe el do y se asigna el nuevo valor en la posicion 1.
i se incrementa y se abre de nuevo el do, ahora enviara eleccion, el vector(con 2 valores) y 2 (i). El ciclo for del metodo numero repetido se ejecutara 2 veces para comparar con los 2 valores existentes en el vector, si es igual a alguno regresa true y el ciclo do se repite para buscar un nuevo numero, si es false se agrega el numero al vector e i se incrementa y se repite el ciclo, etc, etc, etc.
Aunque creo que tu duda era en el primer ciclo, ahi no se ejecuta el for del metodo numeroRepetido puesto que siendo el primer numero no hay nada que comparar, simplemente regresa false.

marzo 30, 2016 | Unregistered Commentercommodore64