CodeGym /Kurslar /Java SELF AZ /İkiölçülü massivlər

İkiölçülü massivlər

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. İkiölçülü massivlər

Massivlərlə bağlı daha bir maraqlı fakt. Massivlər təkcə xətti yox, həm də ikiölçülü ola bilər.

Bəs bu nə deməkdir, deyəcəksiniz?

Bu o deməkdir ki, massiv hüceyrələri təkcə sütun (və ya sətir) şəklində deyil, həmçinin düzbucaqlı bir cədvəl şəklində də təsvir edilə bilər.

int[][] ad = new int[eni][hündürlüyü];

Burada ad — massiv dəyişəninin adı, en — cədvəlin eni (hüceyrələrlə), hündürlüyü isə cədvəlin hündürlüyüdür. Məsələn:

int[][] data = new int[2][5];
data[1][1] = 5;
İkiölçülü massiv yaradırıq: iki sütun və 5 sətir.
(1,1) hüceyrəsinə 5 yazırıq.

Bu yaddaşda belə görünəcəkdir:

İkiölçülü massivlər

Yeri gəlmişkən, ikiölçülü massivlər üçün də sürətli ilkinləşdirmə istifadə etmək olar:

// ilin aylarının uzunluğu rüblər üzrə
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

İkiölçülü massiv sizə proqramçı kimi bir çox yerdə lazım ola bilər. Demək olar ki, istənilən masaüstü oyunun reallaşması hazır ikiölçülü massivdir: «Şahmat», «Dama», «Xaçlar və Nöqtələr», «Gəmi döyüşü»:

İkiölçülü massivlər 2

«Şahmat» və ya «Gəmi döyüşü» kimi oyun taxtasının sahəsi o qədər ideal şəkildə ikiölçülü massivlərə uyğun gəlir ki, hüceyrələrin koordinatları üçün yalnız rəqəmlərdən istifadə etmək lazımdır. «Piyada e2 -> e4» deyil, «piyada (4,1) -> (4,3)». Proqramçı kimi sizin üçün bu daha asan olacaq.


2. Massiv elementlərinin yerləşdirilməsi: (x,y) yoxsa (y,x)

Burada, bu arada, maraqlı bir dilemma var:

Massivi new int[2][5]; kimi yaradanda «iki sətir və 5 sütun» olan bir cədvəl alırıq yoxsa «iki sütun və 5 sətir»? Başqa sözlə, əvvəlcə «eni», sonra «hündurlüyü» təyin edirik, yoxsa əvvəlcə «hündurlük», sonra «eni»? Və, necə deyərlər, burada hər şey o qədər də birmənalı deyil.

Suala başlayaq: bu cədvəl həqiqətən yaddaşda necə saxlanılır?

Kompüterin yaddaşında heç bir cədvəl yoxdur: yaddaşdakı bütün baytlar sadəcə olaraq 0, 1, 2, ... kimi nömrələnib. Bu bizim üçün 2×5 cədvəlidir, amma yaddaşda bu sadəcə olaraq 10 hüceyrədir və vəssalam. Sətir və sütunlar arasında fərq yoxdur.

«En»-«hündürlük» hipotezinin tərəfdarı arqument.

Məktəbdə hər kəsə öyrədilib ki, cüt koordinatdan əvvəlcə «x», sonra «y» göstərilir. Və bu sadəcə məktəb standartı deyil — bu ümumiyyətlə riyaziyyatda standartdır. Elmlərin şahına qarşı çıxmaq, necə deyərlər, mümkün deyil. Bəs necə? Əvvəlcə «en», sonra «hündürlük»?

«Hündürlük»-«en» hipotezinin tərəfdarı arqument.

Burada da maraqlı bir arqument var və bu... ikiölçülü massivlərin sürətli inisializasiyasından gəlir. Axı, massivimizi inisializasiya etmək istəsək, bu kodu belə yazarıq:

// Mühüm məlumat matrisası
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

Heç nə fərq etmirsiniz? Bəs belə olsa:

// Mühüm məlumat matrisası
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

Məlumatlarımızı kodda sətir-sətir yazsaq, 2 sətir və 5 sütun olan bir cədvəl əldə edəcəyik.

Nəticələr

Burada nə deyə bilərik? Sizə hansı uyğundursa, onu seçin. Əsas odur ki, eyni layihə üzərində işləyən bütün proqramçılar eyni üsulu izləsinlər.

Əgər siz çoxlu ikiölçülü massivlərin inisializasiya edildiyi bir layihədə işləyəcəksinizsə, çox güman ki, orada hərkəs məlumatların sürətli inisializasiyasından istifadə edəcək və «hündürlük»-«en» standartına uyğun olacaq.

Amma əgər siz riyaziyyatla çox işlənən və koordinatlarla işlədilən bir layihəyə gəlsəniz (məsələn, oyun mühərrikləri ilə iş), çox güman ki, «en»-«hündürlük» yanaşmasına üstünlük veriləcək.


3. İkiölçülü massivlərin quruluşu

İndi siz 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 massivləridir!

Başqa sözlə desək, əgər adi massivdə “dəyişən-massiv, massiv elementlərini saxlayan konteynerə referans saxlayır”. İkiölçülü massivlərdə vəziyyət bir az daha mürəkkəbdir: dəyişən-ikiölçülü-massiv, birölçülü massivlərə referansları saxlayan konteynerə referans saxlayır. Bunu sözlərlə izah etməkdənsə bir dəfə baxmaq daha yaxşıdır:

İkiölçülü massivlərin quruluşu

Solda “dəyişən-ikiölçülü-massiv” görürsünüz, hansı ki, “obyekt-ikiölçülü massivə” referans saxlayır. Orta hissədə isə “ikiölçülü massiv obyekti” var və onun hüceyrələrində birölçülü massivlərə — ikiölçülü massiv sıralarına referans saxlanır. Sağda isə dörd birölçülü massiv var — bizim ikiölçülü massivimizin sıralarıdır.

Bu, ikiölçülü massivlərin əslində necə qurulduğunu göstərir. Bu yanaşma Java proqramçısına bir neçə üstünlük verir:

Birincisi, “konteynerlər konteyneri” birölçülü massivlərə referans saxladığı üçün, sıraları tez və asanlıqla dəyişmək mümkündür. “Konteynerlər konteynerinə” girmək üçün sadəcə iki əvəzinə bir indeks göstərmək yetərlidir. Məsələn:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

Bu cür kod vasitəsilə sıraları dəyişmək olar:

// Əhəmiyyətli məlumat matrisi
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ü massiv





matrix[0] dəyişəni birinci sıraya referans saxlayır.
Referansları dəyişirik.

Nəticədə matrix belə görünür:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

Əgər siz ikiölçülü massivə müraciət edirsinizsə, amma massiv adından sonra yalnız bir indeks göstərirsinizsə, onda konteyner-konteynerlərə müraciət edirsiniz və hüceyrələrində birölçülü massivlərə referans saxlanılır.


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