Foro

Programadores umbrianos,¡Acudid a mi llamada!

Otros lugares, otras opciones :: Sin clasificar :: Programadores umbrianos,¡Acudid a mi llamada!

Este hilo ha sido cerrado.
05/12/2012, 15:06

La situación es la siguiente, estoy tratando de hacer unos ejercicios en java y he llegado a un punto en que me he atascado bastante, estoy "controlando" un for pero las condiciones de salida ( que deberían ser por que o bien ha encontrado una opción válida o bien por que ha llegado al fin del array) me está dando fallos de que no puedo poner de condiciones un bool y un int...

¿Alguna idea de como ponerlo?

A grandes rasgos, el codigo es esto.

boolean found=false;
   for(int i=0;!(found)|| city.length ;i++){
  
        if(city[i].comeOutFrom(pla, dir)){
   
               this.pla=city[i].nextPlace(pla);
   
               found=true;
  
               System.out.println();
  
          }
   }

 

Me suena que la funcion no es la de .lenght si no que es .size(), sin embargo eso tampoco lo da por válido.

Atrok
 
05/12/2012, 15:11

Yo el java lo tengo oxidadísimo (hace como 7 años que no lo toco), pero length... eso no sería un int que invariablemente te va a devolver el tamaño del array? No deberías compararlo con algo? O si lo que buscas es una función que te devuelve si la siguiente posición está vacía... igual no es length. Dicho quede de antemano que no sé qué hace comeOutFrom.

05/12/2012, 15:12
Editado: 05/12/2012, 15:13

Hace bastante que no toco programación en Java; pero podrías convertir la condición numérica en lógica y que quedar algo así:

boolean found=false;
   for(int i=0;!(found)|| city.length == CteTamanyo ;i++){
 
        if(city[i].comeOutFrom(pla, dir)){
  
               this.pla=city[i].nextPlace(pla);
  
               found=true;
 
               System.out.println();
 
          }
   }

Edit: pues eso, Atrok te ha puesto la idea también.

Edit2: si no sabes la longitud del array ese sí que había método que te devolvía si la posición n-ésima es al última. Ahora ya no me acuerdo exactamente cuál era, habría que tirar de la librería de Java.

05/12/2012, 15:29
Editado: 05/12/2012, 15:31

Como te han dicho el error esta en que se te ha olvidado comparar el length con algo, de hecho te lo ha dicho el error claramente, no puedes comparar con el operando || (OR) el boolean resultado de !(found) con el int resultado del city.length

Lo que te recomienda Jarlnian no tiene mucho sentido, puesto que si city es un array y el iterador solo consulta el array, entonces city nunca cambiará de tamaño... ergo city.length será siempre el tamaño del array (¿invariable durante la ejecución del for?) y CteTamaño será una constante. Puede que sean iguales o no, pero poco o nada tiene que ver con recorrer las posiciones del array. Lo que Jarlnian querría recomendarte debería ser algo como...

boolean found=false;
   for(int i=0;!(found)|| i == city.length; i++){

        if(city[i].comeOutFrom(pla, dir)){
 
               this.pla=city[i].nextPlace(pla);
 
               found=true;

               System.out.println();

          }
   }

 

Esto soluciona el error de compilación pero el código presentará un comportamiento erróneo, lo que probablemente te dará un ArrayOutOfBoundException en aquellos casos en los que no se encuentre nada.... ¡haber si encuentras por que y cual es la comparación correcta!

PD: Nunca he utilizado comparaciones compuestas en un for. Pero me imagino que se podrá... :D lo típico es empelar la sentencia break.

05/12/2012, 16:06

El FOR de Java tiene condición de SALIDA, por lo cual saldría cuando found fuese verdadero o cuando i sea igual al valor de la longitud del array y ten en cuenta que un array de longitud 5, lenght() = 5,  tiene de índices de 0 a 4

monty
 
05/12/2012, 16:46
Editado: 05/12/2012, 17:06

Yo lo haria asi:

boolean found=false;
   for(int i=0;i<city.length; i++) 
        if(city[i].comeOutFrom(pla, dir)){
  
               this.pla=city[i].nextPlace(pla);
  
               found=true;

               System.out.println();

               break;
 
          }
   }

De esta forma el bucle (for) acabara o bien cuando la longitud sea city.length o cuando se cumpla el if. Break lo que hace es finalizar el bucle for.

Pero si quieres hacerlo poniendo las 2 condiciones en el bucle yo lo haria con un while, creo que con un for no se puede asi que con un while seria asi:

boolean found=false;

int i=0;
     while(i<city.length||!found){
            if(city[i].comeOutFrom(pla, dir)){
     
                   this.pla=city[i].nextPlace(pla);
     
                   found=true;

                   System.out.println();

                   i++;
    
              }
       }

 

05/12/2012, 17:50

¡¡¡Buuuuuh!!! Monty aguafiestas, tenía que encontrar la respuesta al menor que él... 

En fin, nunca he probado a hacer una condición compuesta en un for... ¿se podrá? Yo le veo sentido, pero claro como nunca lo he hecho. En ese caso sería..

boolean found=false;
   for(int i=0;!(found) && (i < city.length); i++){

 

        if(city[i].comeOutFrom(pla, dir)){

               this.pla=city[i].nextPlace(pla);

               found=true;

               System.out.println();

 

          }
   }

 

05/12/2012, 19:26

No recomiendo utilizar el break (), de hecho en la carrera todos los profesores que tuve lo "prohibían" porque rompe la progrmación estructurada según ellos, digamos que lo consideran falta de estilo programando.

Antes dije que el for tenía condición de salida y me equivoqué es condición de PERMANENCIA, lapsus:

La solución de darofar me parece la mejor, pero bueno no habría que dárselo tan fácil XD

 

05/12/2012, 20:06

Si bueno, el break es de un switch en el que este es solo uno de los casos, así que tampoco influye, simplemente se me paso borrarlo, el ComeOut.. es simplemente un booleano para comprobar si la opción es valida y si , es la solucion de Darofar, lo que me lleva a la siguiente reflexión,

¿Por qué el p*** Dropbox sube los archivos como le da la gana?

Por ejemplo, subo un rar con una practica de C y apenas una hora despues, lo que bajo es una en Java ¬¬

En fin, ¡Gracias por la ayuda! ^^

Este hilo ha sido cerrado.