2016-04-02 1 views
0

Je ne peux pas pour la vie de moi comprendre pourquoi cette boucle de comparaison de chaîne boucle à nouveau après même quand trouver qu'aucune valeur dans le tableau = cette valeur.pour boucle se répète une fois, même quand on lui dit de ne pas

 Query p = new Query(section).addSort("Login", Query.SortDirection.DESCENDING) ; 
    PreparedQuery qp = datastore.prepare(p); 

    int listSize = 0; 
    for(Entity amount : qp.asIterable()){ 
     listSize++; 
    } 

    for (Entity result2 : qp.asIterable()) { 
     if (breakOff==true) { 
      break; 
     } else { 
      System.out.println("1stloop size is " + size + result2.getProperty("Login")); 
      MyBean temp2 = new MyBean(); 
      temp2.setData((String) result2.getProperty("Login")); 

      Query q = new Query("sent").addSort("Login", Query.SortDirection.DESCENDING); 
      PreparedQuery pq = datastore.prepare(q); 

      int i = 0; 
      for (Entity result : pq.asIterable()) { 

       i++; 
       System.out.println("2ndloop is "+ result.getProperty("Login")); 
       MyBean temp = new MyBean(); 
       temp.setData((String) result.getProperty("Login")); 

       if (temp.getData().equals(temp2.getData())) { 
        System.out.println("broken"); 
        break; 
       } else if (i >= size) { 


        sentNum.setData(temp2.getData()); 
        Entity logins = new Entity("sent"); 
        logins.setProperty("Login", temp2.getData()); 
        datastore.put(logins); 
        System.out.println("sizematch wrote " + temp2.getData()); 
        breakOff = true; 
       } else { 
        System.out.println("increase" + i); 

       } 

      } 
     } 
    } 

Comme vous pouvez le voir, j'appelle un cassage == true si la boucle ne serait pas passer par là à nouveau, mais il le fait toujours. Une fois exactement.

+0

Comme il ne s'agit que d'un petit extrait de votre code, je ne pense pas qu'il y ait vraiment assez d'informations pour tenter de résoudre le problème que vous rencontrez. – TechnoCF

+0

Eh bien, avez-vous utilisé un débogueur pour voir si 'breakOff = true;' est frappé sur la première itération de la boucle. Sur la base de ce que vous dites, il est tout à fait clair que la seconde itération commence à se faire sentir. Utilisez un débogueur et corrigez vos conditions. –

+0

Comment aller ligne par ligne sur le débogueur? Tout ce que je vois est breakOff = true. –

Répondre

0

Eh bien, regardez l'endroit où vous vérifiez si vous avez besoin de casser, c'est au début de la boucle. Cela signifie que le programme va casser dans la prochaine entrée à la boucle, donc il va courir une fois de plus exactement. Pour résoudre ce problème, changez simplement l'emplacement de l'instruction à la fin de la deuxième boucle. ici est votre code fixe: (par la façon dont il est un gâchis, essayez d'organiser un peu)

Query p = new Query(section).addSort("Login", Query.SortDirection.DESCENDING) ; 
    PreparedQuery qp = datastore.prepare(p); 

    int listSize = 0; 
    for(Entity amount : qp.asIterable()){ 
     listSize++; 
    } 

    for (Entity result2 : qp.asIterable()) { 

      System.out.println("1stloop size is " + size + result2.getProperty("Login")); 
      MyBean temp2 = new MyBean(); 
      temp2.setData((String) result2.getProperty("Login")); 

      Query q = new Query("sent").addSort("Login", Query.SortDirection.DESCENDING); 
      PreparedQuery pq = datastore.prepare(q); 

      int i = 0; 
      for (Entity result : pq.asIterable()) { 

       i++; 
       System.out.println("2ndloop is "+ result.getProperty("Login")); 
       MyBean temp = new MyBean(); 
       temp.setData((String) result.getProperty("Login")); 

       if (temp.getData().equals(temp2.getData())) { 
        System.out.println("broken"); 
        break; 
       } else if (i >= size) { 


        sentNum.setData(temp2.getData()); 
        Entity logins = new Entity("sent"); 
        logins.setProperty("Login", temp2.getData()); 
        datastore.put(logins); 
        System.out.println("sizematch wrote " + temp2.getData()); 
        breakOff = true; 
        break; 
       } else { 
        System.out.println("increase" + i); 

       } 

      } 

       if (breakOff) 
         break; 
    } 

avis qu'il n'y a pas de raison de vérifier if(breakOff==true) que vous pouvez également vérifier if(breakOff) et obtenir la même réponse . La raison est que breakOff==true vous donnera vrai si et seulement si breakOff est vrai, mais if(breakOff) sera vrai si et seulement si breakOff est vrai, ils sont donc identiques.

+0

Votre code est en cours d'exécution et le programme lit la pause. Malheureusement, il traverse encore le code une fois. –

+0

quand vous dites qu'il fonctionne encore une autre fois, voulez-vous dire la boucle interne ou la boucle externe? – Moshe9362

+0

La boucle externe. Si I if (breakOff) { System.out.println ("brokenOFF"); pause; } il me donnerait deux ensembles de "brokenOFF" –