Labeled break and continue

Filed Under (informatyka) by Tomek on 03-07-2011

Dawno nie było żadnych postów. Ostatnio ucząc się do Javowego certyfikatu natrafiłem na kilka ciekawych, rzadko stosowanych funkcji Javy, o których nie wiedziałem i którymi chciałem się podzielić. Pierwszą z nich jest labeled break.

Rzecz polega na tym, że normalne instrukcje break i continue, jeżeli odpalone są w zagnieżdżonych pętlach, działają tylko na tą najbardziej wewnętrzną. Moim dotychczasowym tradycyjnym podejściem pozwalającym na przeprowadzenie break’a na pętli zewnętrznej było coś takiego:

  1. // szukamy pozycji zmiennej o wartości takiej jak search w tablicy dwuwymiarowej tab
  2. int[][] tab;
  3. int search;
  4. // odpowiednia inicjalizacja powyższych zmiennych
  5.  
  6. boolean found = false;
  7. int foundI;
  8. int foundJ;
  9.  
  10. for (int i = 0; i < tab.length; i++) {
  11.         for (int j = 0; j < tab[i].length; j++) {
  12.                 if (tab[i][j] == search) {
  13.                         foundI = i;
  14.                         foundJ = j;
  15.                         found = true;
  16.                         break;
  17.                 }
  18.         }
  19.         if (found) {
  20.                 break;
  21.         }
  22. }

Można jednak nadać etykietę pętli zewnętrznej i w ten sposób przeprowadzać wyskakiwanie z dowolnego poziomu zagnieżdżenia pętli (jednak możemy przeprowadzać te skoki tylko wewnątrz pętli, której nadaliśmy etykietę i w pętlach w niej zagnieżdżonych). Powyższy kod z zastosowaniem etykiety mógłby wyglądać następująco:

  1. // szukamy pozycji zmiennej o wartości takiej jak search w tablicy dwuwymiarowej tab
  2.         int[][] tab;
  3.         int search;
  4.         // odpowiednia inicjalizacja powyższych zmiennych
  5.  
  6.         int foundI;
  7.         int foundJ;
  8.  
  9. outer:
  10.         for (int i = 0; i < tab.length; i++) {
  11.                 for (int j = 0; j < tab[i].length; j++) {
  12.                         if (tab[i][j] == search) {
  13.                                 foundI = i;
  14.                                 foundJ = j;
  15.                                 break outer;
  16.                         }
  17.                 }
  18.         }

A poniżej przykład zastosowania instrukcji continue bez etykiety:

  1. // sprawdzamy, czy zmienna o takiej wartości jak search wystąpi w każdym wierszu tablicy tab
  2. int[][] tab;
  3. int search;
  4. // odpowiednia inicjalizacja powyższej zmiennej
  5.  
  6. for (int i = 0; i < tab.length; i++) {
  7.         boolean found = false;
  8.         for (int j = 0; j < tab[i].length; j++) {
  9.                 if (tab[i][j] == search) {
  10.                         System.out.println("Wystąpienie w wierszu " + i);
  11.                         found = true;
  12.                         break;
  13.                 }
  14.         }
  15.         if (!found) {
  16.                 System.out.println("Brak wystąpienia w wierszu " + i);
  17.         }
  18. }

Oraz z etykietą:

  1. // sprawdzamy, czy zmienna o takiej wartości jak search wystąpi w każdym wierszu tablicy tab
  2.         int[][] tab;
  3.         int search;
  4.         // odpowiednia inicjalizacja powyższej zmiennej
  5.  
  6. outer:
  7.         for (int i = 0; i < tab.length; i++) {
  8.                 for (int j = 0; j < tab[i].length; j++) {
  9.                         if (tab[i][j] == search) {
  10.                                 System.out.println("Wystąpienie w wierszu " + i);
  11.                                 continue outer;                        
  12.                         }
  13.                 }
  14.                 System.out.println("Brak wystąpienia w wierszu " + i);
  15.         }

Pomyślnych kodów! :)

Post a comment