1. Giriş
Adi massivi uzun pizza qutusu kimi təsəvvür edin: bütün tikələr sıra ilə düzülüb — dadlıdır, amma yeknəsəqdir.
İndi isə iş cədvəlini və ya şahmat taxtasını təsəvvür edək. Orada hər şey sətirlər və sütunlar şəklində — yəni cədvəl kimi təşkil olunub. Bu, ikiölçülü massiv üçün klassik tapşırıqdır.
Həyatda ikiölçülü massivlər hər addımda qarşımıza çıxır:
- İşçilərin maaş cədvəlləri (sətirlər — işçilər, sütunlar — aylar).
- Ekrandakı şəkil (hər “xana” — pikselin rəngi, onun iki koordinatı var: X və Y).
- Matris hesablamaları və məlumatların emalı.
- Şahmat taxtası və ya X‑O oyunu üçün sahə.
Bəzən ikiölçülü massivə matris də deyilir (bu ad riyaziyyatdan gəlib).
Proqramçı kimi ikiölçülü massivin sizə lazım ola biləcəyi yerlər çoxdur. Demək olar ki, istənilən stolüstü oyunun reallaşdırılması hazır ikiölçülü massivdir: “Şahmat”, “Dama”, “X‑O”, “Dəniz döyüşü”:

“Şahmat”ın və ya “Dəniz döyüşü”nün oyun sahəsi ikiölçülü massivlərə mükəmməl oturur: xanaların koordinatları kimi yalnız rəqəmlərdən istifadə edirsiniz. “piyada e2 ⟶ e4” yox, “piyada (4,1) ⟶ (4,3)”. Proqramçı kimi bu hətta daha rahatdır.
2. İkiölçülü massivlərin elan sintaksisi
İlk elana qədər qorxuludur! Addım-addım baxaq.
Ümumi qayda
tip[][] imyaMassiva;
Buradakı iki boş [] mötərizə — gecə boyu qəhvədən sonra kompilyatorun səhvi deyil, göstəricidir: massiv ikiölçülüdür.
Nümunələr
int[][] matrix;
double[][] gradesTable;
string[][] chessBoard;
Massivin yaradılması
Ölçüləri veririk: sətirlərin və sütunların sayı.
matrix = new int[3][4]; // 3 sətir, 4 sütun
Bu 3x4-lük cədvəldir: 3 sətir və 4 sütunlu Excel cədvəlini təsəvvür edin.
Dərhal dəyişəni elan edib ikiölçülü massiv yarada bilərsiniz:
int[][] matrix = new int[3][4];
Dəyərlərlə birbaşa ilkləndirmək də olar (təxminən birölçülü massivdə olduğu kimidir):
int[][] example = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Cədvəl: 3 sətir, 3 sütun
Vizual sxem
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← sütunlar (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │ 0,1 │ 0,2 │ 0,3 │ ← sətir 0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │ 1,1 │ 1,2 │ 1,3 │ ← sətir 1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │ 2,1 │ 2,2 │ 2,3 │ ← sətir 2 (Row 2)
└─────┴─────┴─────┴─────┘
Hər element iki indeks cütü ilə verilir [sətir, sütun].
3. İndeksləmə və elementlərə çıxış
İkiölçülü massivdə elementə çıxış üçün iki indeks göstərilir:
- Birincisi — sətirin nömrəsi.
- İkincisi — sütunun nömrəsi.
// İkinci sətirdə (indeks 1), üçüncü sütun (indeks 2)
matrix[1][2] = 99;
Şahmata öyrəşənlər üçün xatırladaq: indekslər sıfırdan başlayır. Yəni birinci element — bu [0][0]-dır.
Yazma və oxuma
int[][] data = new int[5][2];
data[1][1] = 5; // yazma
int value = data[1][1]; // oxuma
Bu, yaddaşda belə görünəcək:

4. İkiölçülü massivin doldurulması
Gəlin 1-dən 12-yə qədər ardıcıl ədədlərlə matrisi dolduran kod yazaq ki, necə işlədiyini görək.
int[][] matrix = new int[3][4];
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
matrix[row][col] = value;
value++;
}
}
İllüstrasiya:
Yerinə yetirildikdən sonra:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │ 10 │ 11 │ 12 │
└────┴────┴────┴────┘
5. İkiölçülü massivlərin quruluşu
İndi isə ikiölçülü massivlərin əslində necə qurulduğunu öyrənəcəksiniz. Hazırsınız?
İkiölçülü massivlər əslində massivlərin massividir!
Başqa sözlə, əgər adi massivdə “massiv dəyişəni massivin elementlərini saxlayan konteynerə istinad saxlayırsa”, ikiölçülü massivlərdə vəziyyət bir az daha “partlayışlıdır”: ikiölçülü‑massiv dəyişəni birölçülü massislərə istinadları saxlayan konteynerə istinad saxlayır. Bunu yüz dəfə izah etməkdənsə bir dəfə görmək daha yaxşıdır:

Solda bizdə “ikiölçülü‑massiv dəyişəni” var və o, “ikiölçülü massiv obyektinə” istinad saxlayır. Ortada “ikiölçülü massiv obyekti” var, onun xanalarında birölçülü massislərə istinadlar saxlanılır — ikiölçülü massivimizin sətirləri. Və sağda isə ikiölçülü massivimizin sətirləri olan dörd birölçülü massivi görürsünüz.
İkiölçülü massivlərin həqiqi quruluşu budur. Bu yanaşma Java proqramçısına bir neçə üstünlük verir:
Birincisi, “konteynerlərin konteyneri” “sətir‑massivlərə” istinadları saxladığı üçün sətirləri çox tez və asanlıqla yerləri ilə dəyişə bilərik. “Konteynerlərin konteynerinə” çıxış üçün iki indeks əvəzinə sadəcə bir indeks göstərmək kifayətdir. Nümunə:
int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];
Belə bir kodla sətirləri yerləri ilə dəyişmək olar:
// Məlumatları olan vacib matris
int[][] matrix = {
{1, 2, 3, 4, 5},
{5, 4, 3, 2, 1}
};
int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
İkiölçülü massivin hüceyrəsinə müraciət edərkən, massiv adından sonra yalnız bir indeks göstərsəniz, siz beləliklə birölçülü massislərə istinadlar saxlayan “konteynerlərin konteynerinə” müraciət etmiş olursunuz.
6. İkiölçülü massivin ekrana çıxarılması
İkiölçülü cədvəli çıxarmaq üçün adətən ikiqat dövr istifadə olunur — bu, konsolda labirint “çəkmək” kimidir. Nümunə:
for (int row = 0; row < matrix.length; row++)
{
for (int col = 0; col < matrix[row].length; col++)
{
System.out.print(matrix[row][col] + "\t");
}
System.out.println(); // yeni sətrə keçid
}
Çıxış nümunəsi:
1 2 3 4
5 6 7 8
9 10 11 12
Yeri gəlmişkən, burada bir neçə sətir kodla cədvəlləri necə səliqəli “çəkəcəyinizi” öyrəndiniz!
GO TO FULL VERSION