JavaRush /Kurslar /All lectures for UZ purposes /Ikki o'lchamli Massivlar

Ikki o'lchamli Massivlar

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Ikki o'lchamli massivlar

Massivlar haqida yana bir qiziq fakt. Massivlar faqat chiziqli emas, balki ikki o'lchamli ham bo'lishi mumkin.

Bu nimani anglatadi, deysizmi?

Bu shuni anglatadi-ki, massivning har bir hujayrasini nafaqat ustun yoki qator shaklida balki to'rtburchak jadval shaklida ham tasavvur qilish mumkin.

int[][] name = new int[width][height];

Qayerda name — massiv o'zgaruvchanining nomi, width — bu jadval kengligi (hujayralarda), height — jadvalning balandligi. Misol:

int[][] data = new int[2][5];
data[1][1] = 5;
Ikki o'lchamli massiv yaratamiz: ikki ustun va 5 qator.
(1,1) hujayrasida 5-ni yozamiz.

Bu xotirada qanday ko'rinish bo'lishini:

Ikki o'lchamli massivlar

Aytgancha, ikki o'lchamli massivlar uchun tezkor tashabbusdan foydalanish mumkin:

// oyliklar yil davomida choraklar bo'yicha
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

Juda ko'p joyda, siz dasturchi sifatida ikkio'lchamli massivga muhtoj bo'lishingiz mumkin. Har qanday stol usti o'yinini amalga oshirish — bu tayyor ikkio'lchamli massiv: "Shaxmat", "Dama", "X va O", "Dengiz jangi":

Ikki o'lchamli massivlar 2

"Shaxmat" yoki "Dengiz jangi" o'yin maydoni shundayki, u ikki o'lchamli massivlarga ideal tarzda joylashadi, lekin hujayralar koordinatlarida faqat raqamlarni ishlatishingiz kerak bo'ladi. "e2 piyoda o'yinida emas e4", balki "(4,1) piyoda -> (4,3)". Sizga dasturchi sifatida yanada qulayroq bo'ladi.


2. Massivlardagi elementlarning joylashuvi: (x,y) yoki (y,x)

Bu yerda qiziqarli dilemmani ko'ryapmiz:

Massivni new int[2][5] yaratganimizda; bizda jadval "ikki qator va 5 ustun" yoki "ikki ustun va 5 qatormi? Boshqacha aytganda, avval "kenglik", keyin "balandlik"ni belgilaymizmi yoki avval "balandlik", keyin "kenglik"mi? Hammasi bundan ham ko'p ma'no anglatadi.

Savoldan boshlaylik: bunday jadval aslida xotirada qanday saqlanadi?

Kompyuter xotirasida hech qanday jadval yo'q: barcha xotira baytlari 0, 1, 2, ... shaklida raqamlanadi. Bu biz uchun 2×5 jadval, lekin xotirada bu oddiy 10 ta hujayra va hammamiz shunday. Qatarlari va ustunlari qayerda ekanligiga ajratmasdan.

"Kenglik"-"balandlik" gipotezasi foydasidagi dalil.

Maktabda hammani o'rgatgan edi, to'plam koordinatining birinchi "x" va keyin "y" ko'rsatiladi. Va bu faqat maktab standarti emas - bu matematikada umumiy standart. Sayyod ilmi qirolichasiga qarshi chiqish degan narsa bo'lmaydi. Demak nima? Avval "kenglik", keyin "balandlik"mi?

"Balandlik"-"kenglik" gipotezasi foydasidagi dalil.

Bu yerda ham qiziqarli dalil bor va u... ikki o'lchamli massivlarni tezkor tashabbusidan kelib chiqadi. Chunki agar biz massivni tashabbus bilan ishlatmoqchi bo'lsak, bu kodni quyidagicha yozamiz:

// Muhim ma'lumotlar matritsasi
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

Hech nimani sezmayapsizmi? Va bunday:

// Muhim ma'lumotlar matritsasi
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

Agar biz kodda ma'lumotlarimizni qator tarzida yozsak, bizda 2 qator va 5 ustunli jadval kelib chiqadi.

Natijalar

Nima deysiz bu yerda? Sizga imkoniyat berildi va sizga qulay bo'lgan usulga qaror qiling. Muhimi, bir loyihada ishlayotgan barcha dasturchilar bitta usulni qabul qilishadi.

Agar siz kodda ko'p miqdorda tashabbus qilingan ikki o'lchamli massivlar bilan ishlaydigan loyihada ishlasangiz, ehtimol u yerda hamma ma'lumotlar tasvirini asos qilgan holda "balandlik"-"kenglik" standarti qabul qilinadi.

Agar siz matemetikaga juda boy loyiha qilish bo'yicha omadingiz bo'lsa va koordinatlar bilan ishlaydigan loyiha (masalan, o'yin motorlari bilan ishlash), ehtimol u yerda "kenglik"-"balandlik" usuliga amal qilinadi


3. Ikki o'lchamli massivlar tuzilishi

Hoziroq siz ikki o'lchamli massivlarning aslida qanday tuzilganligini bilasiz. Tayyor bo'ldingizmi?

Ikki o'lchamli massivlar — bu aslida massivlar massivi!

Boshqacha aytganda, agar oddiy massiv misolida "massiv o'zgaruvchisi, massivning elementlarini saqlovchi kontaynerga ishora qiladi". Ikki o'lchamli massivlar holatida bizda vaziyat biroz portlashli: ikki o'lchamli massiv o'zgaruvchisi, oddiy massivga ishoralarni saqlovchi konteynerga ishora qiladi. Buni yuz marta tushuntirishga qaraganda bir marta ko'rgan ma'qul:

Ikki o'lchamli massivlar tuzilishi

Chapda bizda "ikki o'lchamli massiv o'zgaruvchisi", u "ikki o'lchamli massiv obyekti"ga ishora qiladi. O'rtada bizda "ikki o'lchamli massiv obyekti" bor, uning hujayralarida oddiy massivlar — ikki o'lchamli massivning qatorlari ishoralari saqlanadi. O'ngda siz ikki o'lchamli massivning qatorlari bo'lgan to'rtta oddiy massivni ko'ryapsiz.

Ikki o'lchamli massivlar aslida shunday tuzilgan va bunday yondashuv Java dasturchisiga bir necha afzalliklar beradi:

Birinchidan, "kontyner konteynerlari" o'zgaruvchisi "massiv qatorlari" ishoralarini saqlaganligi sababli, biz qatorlarni joyini juda tez va oson o'zgartira olamiz. "Kontyner konteyneri"ga kirish uchun faqat bitta indeks, ikki o'rniga ko'rsatish kifoya. Misol:

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

Mana bunday kod yordamida qatorlar joyini o'zgartirish mumkin:

// Muhim ma'lumotlar matritsasi
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
Ikki o'lchamli massiv





matrix[0]da bizda birinchi qator ishorasi saqlanadi.
Ishoralarni joyini o'zgartiramiz.

Natijada matrix massivi quyidagicha ko'rinadi:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

Agar siz ikki o'lchamli massivning hujayrasiga murojaat qilsangiz, lekin massiv nomidan keyin faqat bitta indeks ko'rsatsangiz, ana shunday qilib siz odatiy o'lchamli massivlarni saqlovchi konteyner-konteynerlariga murojaat qilasiz.


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION