2016-10-08 1 views
-1

J'ai essayé continuer & casser les étiquettes en Java mais il lancer des erreurs.étiquette ne fonctionne pas, j'ai essayé de mon mieux

Voici le code:

private int search(int[] seq, int key, int low, int high){ 
    int mid = low + (high - low)/2; 
    out : //label 
    if (key == mid) { 
     return mid; 
    } 
    if (key < mid) { 
     high = mid; 
     if (key != mid) { 
      break out; 
     } 
    } 
    return 1; 
} 
+1

Veuillez poster le code dans votre question pour les futurs lecteurs, au cas où le lien vers cette image ne fonctionnerait plus. – markspace

+1

Code postal pas d'images. Pour ma part, je préfère ne pas naviguer vers des liens Imgur aléatoires publiés par de nouveaux utilisateurs. –

+1

@BoristheSpider Ok les gars, je l'ai copié. –

Répondre

0

Etiqueté break fonctionne uniquement avec des cycles. Et méfiez-vous, ils ne sont pas équivalent goto parce qu'ils transfèrent le contrôle à l'instruction suivante après le cycle de rodage ed.

Voici un exemple copié de la language basics tutorial - break statement sur le site d'Oracle (je suis trop paresseux pour être original si d'autres bons exemples sont disponibles):

public static void main(String[] args) { 

     int[][] arrayOfInts = { 
      { 32, 87, 3, 589 }, 
      { 12, 1076, 2000, 8 }, 
      { 622, 127, 77, 955 } 
     }; 
     int searchfor = 12; 

     int i; 
     int j = 0; 
     boolean foundIt = false; 

    search: 
     for (i = 0; i < arrayOfInts.length; i++) { 
      for (j = 0; j < arrayOfInts[i].length;j++) { 
       if (arrayOfInts[i][j] == searchfor) { 
        foundIt = true; 
        break search; 
       } 
      } 
     } 

     if (foundIt) // etc 
    } 
} 

Juste au cas où vous êtes intéressé plus sur la façon pour résoudre la recherche binaire que comment utiliser break sur les étiquettes. Le code ci-dessous a la même performance que celui qui utiliserait goto (s'ils existent réellement en java).

private static int search(int[] seq, int key, int low, int high) { 

    while (low <= high) { 
     // this is as good as low+(high-low)/2. 
     int mid = (low + high) >>> 1; // this is (low+high)/2 

     int midVal = seq[mid]; 

     if (midVal < key) { 
      low = mid + 1; 
     } 
     else if (midVal > key) { 
      high = mid - 1; 
     } 
     else { 
      // why break when you can return? 
      return mid; // key found 
     } 
    } 
    // key not found. Return the 2's complement of the insert position: 
    // that is -(insertPosition+1) 
    return -(low + 1); 
} 
1

Les étiquettes doivent être utilisées avec des boucles si vous avez 3 boucles et vous devez appeler la rupture; dans la boucle la plus interne, vous utiliseriez une étiquette pour rompre avec la boucle externe, car si vous appelez simplement break; il va briser le plus profond et aller à la boucle du milieu. Vous utilisez mal l'étiquette et vous pouvez facilement résoudre votre problème en utilisant soit if .. else else et instructions ou utiliser l'instruction switch.

+0

Sean et Peter ont raison: les étiquettes fonctionnent avec des * boucles seulement. * Pas des instructions "if" comme l'OP et pas d'autres blocs de code. Comme Sean le mentionne, il est facile de sortir d'un 'si 'si vous le structurez correctement. – markspace