Tablouri (Matrice)
Un tablou (sau matrice) reprezintă un set de valori de același tip. Declarația unui tablou este similară cu declarația unei variabile care stochează o singură valoare, iar în Java există două moduri de a declara un tablou:
tip_date nume_tablou[];
// sau
tip_date[] nume_tablou;
De exemplu, putem defini un tablou de numere astfel:
int nums[];
int[] nums2;
După declararea tabloului, acesta trebuie inițializat:
int nums[];
nums = new int[4]; // tablou de 4 numere
Crearea unui tablou se face prin următoarea sintaxă: new tip_date[număr_elemente], unde new este cuvântul cheie care alocă memorie pentru numărul specificat de elemente. De exemplu, nums = new int[4]; creează un tablou cu patru elemente de tip int, fiecare având valoarea implicită 0.
Putem inițializa tabloul și în momentul declarării:
int nums[] = new int[4]; // tablou cu 4 numere
int[] nums2 = new int[5]; // tablou cu 5 numere
La inițializare, toate elementele tabloului primesc valoarea implicită. Pentru tipurile numerice (inclusiv pentru char), valoarea implicită este 0, pentru tipul boolean este false, iar pentru alte obiecte este null. De exemplu, tabloul nums va conține patru zerouri.
De asemenea, putem specifica valori explicite pentru elementele tabloului:
int[] nums = new int[] { 1, 2, 3, 5 };
int[] nums2 = { 1, 2, 3, 5 };
În acest caz, dimensiunea tabloului nu este specificată în parantezele pătrate, deoarece este calculată automat pe baza numărului de elemente specificate în acolade.
După crearea tabloului, putem accesa oricare dintre elementele sale prin intermediul indicilor, care se specifică în parantezele pătrate după numele variabilei tabloului:
int[] nums = new int[4];
// setăm valorile elementelor tabloului
nums[0] = 1;
nums[1] = 2;
nums[2] = 4;
nums[3] = 100;
// obținem valoarea celui de-al treilea element
System.out.println(nums[2]); // 4
Indexarea elementelor unui tablou începe de la 0, astfel încât pentru a accesa al patrulea element, folosim nums[3]. Dacă încercăm să accesăm un element dincolo de dimensiunea tabloului, de exemplu nums[5] = 5;, vom primi o eroare.
Lungimea tabloului
Proprietatea length returnează lungimea tabloului, adică numărul de elemente pe care le conține:
int[] nums = {1, 2, 3, 4, 5};
int length = nums.length; // 5
Pentru a accesa ultimul element dintr-un tablou, putem folosi această proprietate:
int last = nums[nums.length - 1];
Tablouri multidimensionale
Pe lângă tablourile unidimensionale, care pot fi considerate ca o listă de valori de același tip, există și tablouri multidimensionale, cel mai cunoscut fiind tabloul bidimensional (o matrice):
int[] nums1 = new int[] { 0, 1, 2, 3, 4, 5 };
int[][] nums2 = { { 0, 1, 2 }, { 3, 4, 5 } };
Vizual, ambele tablouri ar arăta astfel:
- Tabloul unidimensional nums1:
/images/image1.png)
- Tabloul bidimensional nums2 (matrice):
/images/image2.png)
Deoarece tabloul nums2 este bidimensional, îl putem considera o simplă matrice. De asemenea, putem crea un astfel de tablou cu sintaxa int[][] nums2 = new int[2][3];, unde numărul de paranteze pătrate indică dimensiunea tabloului, iar valorile din paranteze specifică numărul de rânduri și coloane. Putem accesa elementele sale astfel:
nums2[1][0] = 44;
System.out.println(nums2[1][0]); // 44
Declarația unui tablou tridimensional ar arăta astfel:
int[][][] nums3 = new int[2][3][4];
Tablouri zimțate
Tablourile multidimensionale pot fi, de asemenea, reprezentate ca "tablouri zimțate". În exemplul de mai sus, tabloul bidimensional avea 2 rânduri și 3 coloane, formând astfel o matrice regulată. Totuși, putem atribui fiecărui element dintr-un tablou bidimensional un alt tablou cu un număr diferit de elemente:
int[][] nums = new int[3][];
nums[0] = new int[2];
nums[1] = new int[3];
nums[2] = new int[5];
Iterarea elementelor tabloului: foreach
Java oferă o versiune specială a ciclului for pentru a itera prin elementele unui tablou sau colecție, asemănător ciclului foreach din alte limbaje:
int[] array = new int[] { 1, 2, 3, 4, 5 };
for (int i : array) {
System.out.println(i);
}
Aceasta este o variantă simplă și eficientă de a parcurge toate elementele unui tablou.
Totuși, același lucru poate fi realizat și cu versiunea clasică a ciclului for:
int[] array = new int[] { 1, 2, 3, 4, 5 };
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
Această versiune este mai flexibilă, permițând modificarea elementelor tabloului:
int[] array = new int[] { 1, 2, 3, 4, 5 };
for (int i = 0; i < array.length; i++) {
array[i] = array[i] * 2;
System.out.println(array[i]);
}
Iterarea tablourilor multidimensionale
Pentru a parcurge elementele unui tablou bidimensional, putem folosi un ciclu dublu for:
int[][] nums = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
System.out.printf("%d ", nums[i][j]);
}
System.out.println();
}
În acest caz, primul ciclu iterează prin rândurile matricei, iar al doilea ciclu parcurge coloanele fiecărui rând. Aceeași metodă poate fi aplicată și pentru tablourile tridimensionale sau de dimensiuni mai mari.