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:
-
// szukamy pozycji zmiennej o wartości takiej jak search w tablicy dwuwymiarowej tab
-
int[][] tab;
-
int search;
-
// odpowiednia inicjalizacja powyższych zmiennych
-
-
boolean found = false;
-
int foundI;
-
int foundJ;
-
-
for (int i = 0; i < tab.length; i++) {
-
for (int j = 0; j < tab[i].length; j++) {
-
if (tab[i][j] == search) {
-
foundI = i;
-
foundJ = j;
-
found = true;
-
break;
-
}
-
}
-
if (found) {
-
break;
-
}
-
}
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:
-
// szukamy pozycji zmiennej o wartości takiej jak search w tablicy dwuwymiarowej tab
-
int[][] tab;
-
int search;
-
// odpowiednia inicjalizacja powyższych zmiennych
-
-
int foundI;
-
int foundJ;
-
-
outer:
-
for (int i = 0; i < tab.length; i++) {
-
for (int j = 0; j < tab[i].length; j++) {
-
if (tab[i][j] == search) {
-
foundI = i;
-
foundJ = j;
-
break outer;
-
}
-
}
-
}
A poniżej przykład zastosowania instrukcji continue bez etykiety:
-
// sprawdzamy, czy zmienna o takiej wartości jak search wystąpi w każdym wierszu tablicy tab
-
int[][] tab;
-
int search;
-
// odpowiednia inicjalizacja powyższej zmiennej
-
-
for (int i = 0; i < tab.length; i++) {
-
boolean found = false;
-
for (int j = 0; j < tab[i].length; j++) {
-
if (tab[i][j] == search) {
-
found = true;
-
break;
-
}
-
}
-
if (!found) {
-
}
-
}
Oraz z etykietą:
-
// sprawdzamy, czy zmienna o takiej wartości jak search wystąpi w każdym wierszu tablicy tab
-
int[][] tab;
-
int search;
-
// odpowiednia inicjalizacja powyższej zmiennej
-
-
outer:
-
for (int i = 0; i < tab.length; i++) {
-
for (int j = 0; j < tab[i].length; j++) {
-
if (tab[i][j] == search) {
-
continue outer;
-
}
-
}
-
}
Pomyślnych kodów! :)
