CodeGym /Kurslar /JAVA 25 SELF /Pilləli massivlər (Jagged Arrays)

Pilləli massivlər (Jagged Arrays)

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. Pilləli massivlər ikiölçülü massivlərdən fərqlənir

Budur, bir çoxlarının “pilləli massivlər” adlandırdığı mövzuya gəlib çatdıq — ingiliscə jagged arrays. İkiölçülü massivlərdən fərqli olaraq, pilləli massivlər sətirlərin fərqli uzunluqda olmasına imkan verir. Bu, elə bil sizdə binalar kompleksi var və hər binanın mənzil sayı fərqlidir — birində 5 mənzil, digərində 20, üçüncüsündə isə cəmi bir dənə.

Pilləli massiv — elementlərinin hər biri massiv olan massivi ifadə edir və bu zaman daxili massivlər (onları “alt massivlər” də adlandırırlar) müxtəlif uzunluğa malik ola bilər.

Əsas fərq:

  • İkiölçülü massivdə hər “sətir”in (və hər “sütun”un) element sayı eynidir. Nümunə: int[][] grid = new int[3][5]; — bizdə həmişə 3 sətir və hər birində 5 element var.
  • Pilləli massivdə hər sətirin uzunluğu fərqli ola bilər! Nümunə: int[][] jagged = new int[3][]; — və yalnız bundan sonra hər sətiri (alt massivi) öz tərzimizcə ilkləndiririk.

Bu, vizual olaraq belə görünür:

İkiölçülü massiv (3x3):
┌───┬───┬───┐
│ 1 │ 2 │ 3 │
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 7 │ 8 │ 9 │
└───┴───┴───┘

Pilləli massiv (müxtəlif uzunluqlar):
┌───┬───┐
│ 1 │ 2 │
├───┼───┼───┬───┐
│ 3 │ 4 │ 5 │ 6 │
├───┼───┴───┴───┘
│ 7 │
└───┘

2. Pilləli massivlərin elan edilməsi və ilkləndirilməsi sintaksisi

Pilləli massivi elan etmək əvvəlkilərdən heç də çətin deyil! Cüt kvadrat mötərizələrdən qorxmağa dəyməz:


int[][] jaggedArray = new int[3][];
Pilləli massiv elan edilməsi: xarici ölçü verilib, daxili massivlər hələ yaradılmayıb

Bu o deməkdir ki, 3 elementdən ibarət bir massivimiz var və onların hər biri də int massividir. Amma hələ daxili massivlər yaradılmayıb! Daha yaxşı anlamaq üçün gəlin bunu daha ətraflı nəzərdən keçirək.

Pilləli massivlərin addım-addım ilkləndirilməsi

Addım 1 — əsas (xarici) massivin yaradılması:

int[][] jaggedArray = new int[3][];

İndi bizdə 3 “sətir” var, lakin onların hamısı hələlik null-dur.

Addım 2 — daxili massivlərin (alt massivlərin) yaradılması və doldurulması:
Məsələn, birinci sətirin uzunluğu 2, ikinci — 4, üçüncü — 3 olsun:

jaggedArray[0] = new int[2]; // Birinci sətirdə 2 element
jaggedArray[1] = new int[4]; // İkinci sətirdə 4 element
jaggedArray[2] = new int[3]; // Üçüncü sətirdə 3 element

Addım 3 — dəyərlərlə doldurma:
Daxili massivlər adi massivlərdir! Məsələn:

jaggedArray[0][0] = 1;
jaggedArray[0][1] = 2;

jaggedArray[1][0] = 3;
jaggedArray[1][1] = 4;
jaggedArray[1][2] = 5;
jaggedArray[1][3] = 6;

jaggedArray[2][0] = 7;
jaggedArray[2][1] = 8;
jaggedArray[2][2] = 9;

Pilləli massivlərin qısa ilkləndirilməsi

Əgər dəyərləri əvvəlcədən bilirsinizsə, pilləli massivi dərhal yarada və doldura bilərsiniz:

int[][] jaggedArray = new int[][]
{
    new int[] { 1, 2 },
    new int[] { 3, 4, 5, 6 },
    new int[] { 7, 8, 9 }
};

Və ya bir az daha qısa, daxili massivlərin tipini göstərmədən:

int[][] jaggedArray = 
{
    { 1, 2 },
    { 3, 4, 5, 6 },
    { 7, 8, 9 }
};

3. Pilləli massivlərin üzərindən keçmək və onlarla işləmək

Pilləli massivi iterasiya etmək ikiölçülü massivdən çətin deyil, lakin indi xarici dövr sətirlər üzrə, daxili isə sətirin elementləri üzrə gedir (onların uzunluğu fərqli ola bilər):

for (int i = 0; i < jaggedArray.length; i++) 
{
    System.out.println("Sətir " + i + ":");
    for (int j = 0; j < jaggedArray[i].length; j++) 
    {
        System.out.print(jaggedArray[i][j] + " ");
    }
    System.out.println();
}

Ekranda nəticə:

Sətir 0:
1 2 
Sətir 1:
3 4 5 6 
Sətir 2:
7 8 9 

for-each istifadə edərək indekslər barədə düşünməmək olar:

for (int[] row : jaggedArray) 
{
    for (int value : row) 
    {
        System.out.print(value + " ");
    }
    System.out.println();
}

4. Pilləli massivlərdən istifadə üçün tipik ssenarilər

Pilləli massiv nə vaxt ikiölçülü massivdən daha faydalı ola bilər?

  • Əgər hər istifadəçi üçün müxtəlif sayda məlumat saxlayırsınızsa: fənlər üzrə qiymətlər, alışlar, şərhlər və s.
  • Əgər məlumatlarınız üçbucaq və ya pilləli quruluşa malikdirsə (məsələn, piramidaların, Paskal üçbucaqlarının çıxarılması və s.).
  • Əgər yaddaşa qənaət etmək istəyirsinizsə: ikiölçülü massivdə bütün sətirlər sabitdir, pilləli massivdə isə yalnız lazım olan sayda element var.

Həyatdan nümunə: tələbə qiymətləri meneceri

Tutaq ki, üç tələbəmiz var və onların riyaziyyat üzrə müxtəlif tapşırıqlardan aldıqları qiymətlər belədir:

Tələbə Qiymətlər
0 5, 4
1 3, 4, 4
2 5

Belə bir massiv elan edək:

int[][] studentMarks = new int[3][];
studentMarks[0] = new int[] { 5, 4 };         // Birinci tələbə — 2 qiymət
studentMarks[1] = new int[] { 3, 4, 4 };      // İkinci tələbə — 3 qiymət
studentMarks[2] = new int[] { 5 };            // Üçüncü tələbə — 1 qiymət

Hər tələbənin qiymətlərini çıxaraq:

for (int i = 0; i < studentMarks.length; i++) 
{
    System.out.print("Tələbə " + i + ": ");
    for (int j = 0; j < studentMarks[i].length; j++) 
    {
        System.out.print(studentMarks[i][j] + " ");
    }
    System.out.println();
}

Pilləli massivlərin digər tiplərlə istifadəsi

Pilləli, istənilən şeyin massivi ola bilər: sətirlərin, başqa massivlərin massivləri (daha dərin!), hətta öz obyektlərinizin.

Nümunə: sətir massivi

String[][] groups = {
    { "Ivan", "Pyotr" },
    { "Mariya", "Aleksey", "Sergey" },
    { "Vasilisa" }
};

5. Üçölçülü və çoxölçülü massivlər

Və ehtimal ki, artıq təxmin etdiyiniz massslvlərlə bağlı daha bir maraqlı fakt. Əgər ikiölçülü massiv yaratmaq mümkündürsə, bəs üçölçülünü?

Bəli, istənilən ölçüdə massiv yaratmaq olar. Belə massivlərə çoxölçülü massivlər deyilir.

Çoxölçülü massivlərin elan edilməsi

Lazımi sayda ölçünü mötərizələrlə ardıcıl göstərmək kifayətdir:

int[][][] cube = new int[2][3][4]; // 2 "qat", 3 sətir, 4 sütun
cube[0][1][2] = 99;

Burada bizdə üçölçülü massiv var:

  • 2 element birinci koordinat üzrə,
  • 3 — ikinci üzrə,
  • 4 — üçüncü üzrə.

Belə massiv ardıcıl şəkildə qablaşdırılmış böyük bir “məlumat kubu”dur.

Üçölçülü massiv üzərində iterasiya

Elementə giriş bütün indekslər üzrə eyni anda aparılır:

for (int i = 0; i < cube.length; i++) 
{
    for (int j = 0; j < cube[i].length; j++) 
    {
        for (int k = 0; k < cube[i][j].length; k++) 
        {
            System.out.print(cube[i][j][k] + " ");
        }
        System.out.println();
    }
    System.out.println("---");
}
  • İndekslər sıfırdan başlayır, hər zaman Java-da olduğu kimi.
  • Belə massivdə cəmi 2 × 3 × 4 = 24 element olacaq.

Çoxölçülü massivlərin praktiki nümunələri

  • 2D — cədvəllər, şahmat taxtaları, təsvirlər.
  • 3D — kompüter qrafikasında “kublar”, elmi hesablamalar üçün məlumatlar (məsələn, məkan və zamanın müxtəlif nöqtələrində temperatur).
  • 4D və yuxarı — nadir hallarda istifadə olunur, lakin qabaqcıl riyaziyyat, simulyasiyalar, maşın öyrənməsi və s. sahələrdə rast gəlinir.

6. Çoxölçülü massivlərlə işləyərkən tipik səhvlər

Səhv №1: Massivin sərhədlərindən kənara çıxma

Ən məşhur səhv — mövcud olmayan elementə müraciət etmək cəhdi, məsələn:

int[][] arr = new int[2][3];
arr[2][0] = 5; // Səhv! İndeksi 2 olan sətir yoxdur (yalnız 0 və 1 var)
arr[0][3] = 7; // Səhv! İndeksi 3 olan sütun yoxdur (yalnız 0, 1, 2 var)

Belə müraciətdə proqram ArrayIndexOutOfBoundsException atacaq. Həmişə yoxlayın ki, indekslər icazə verilən sərhədlərdədir: 0-dan uzunluq - 1-ə qədər.

Səhv №2: Pilləli massivdə ilkləndirilməmiş sətirlər

Əgər pilləli massiv yaradıb daxili massivləri ilkləndirməyi unutsaq, müraciət zamanı NullPointerException olacaq:

int[][] jagged = new int[3][];
jagged[0][0] = 5; // Səhv! jagged[0] == null

Əvvəlcə daxili massivi yaratmaq lazımdır: jagged[0] = new int[2];

Səhv №3: Massivin uzunluğundan yanlış istifadə

Tez-tez matrix.length (sətirlərin sayı) ilə matrix[0].length (sütunların sayı) qarışdırılır. Xüsusilə kopyalama, iterasiya, sütunlar üzrə cəmləmə zamanı.

Səhv №4: Bütün sətirlərin eyni uzunluqda olduğunu güman etmək

Pilləli massivlərdə sətirlər müxtəlif uzunluqda ola bilər! Əgər matrix[i][j] yazırsınızsa, j < matrix[i].length olduğuna əmin olun.

Səhv №5: İndekslərin sırasını qarışdırmaq

Bəzən birincinin sətir, sonra sütun olduğunu qarışdırırlar: matrix[sətir][sütun]. Əksinə deyil!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION