Codegym Üniversitesi kursunun bir parçası olarak bir akıl hocası ile bir ders parçası. Tüm kurs için kaydolun.


"Selamlar, Amigo!"

"Merhaba Rishi!"

"Diziler hakkında zaten bir iki şey biliyorsunuz ve hatta umarım bazı görevleri çözmeyi başardınız. Ama her şeyi bilmiyorsunuz. Örneğin, dizilerle ilgili başka bir ilginç gerçek. Diziler yalnızca tek boyutlu (doğrusal) değildir ) İki boyutlu da olabilirler."

"Hmm... Bu ne anlama geliyor?"

"Bu, dizinin hücrelerinin yalnızca bir sütunu (veya satırı) değil, aynı zamanda bir dikdörtgen tabloyu da temsil edebileceği anlamına gelir.

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

"Ad , dizi değişkeninin adı, genişlik tablo genişliği (hücrelerde) ve yükseklik tablo yüksekliğidir. Bir örneğe bakın:

int[][] data = new int[2][5];
data[1][1] = 5;
İki boyutlu bir dizi oluşturuyoruz: 2 sütun ve 5 satır.
(1,1) hücresine 5 yazıyoruz.

"Hafızada şöyle görünecek:

İki boyutlu diziler

"Bu arada, iki boyutlu diziler için hızlı başlatmayı da kullanabilirsiniz:

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

"Hmm... işte bu ilginç. İlk iç köşeli parantezlerin bir elemanı, sonrakinin ise ikinciyi temsil ettiğini düşünürsek... Yani iki boyutlu bir dizi, bir diziler dizisi gibi mi?"

"Ne kadar zeki bir öğrencisin! Kesinlikle. İlk öğe tek boyutlu dizi {31, 28, 31}, ikincisi ise {30, 31, 30}vb. Ama buna bu derste biraz sonra döneceğiz. O zamana kadar, her kesişme noktasında hücreler oluşturan satırlar ve sütunlar içeren bir tablo olarak iki boyutlu bir dizi.

"Aklımda bununla ilgili bir resim var. Bu arada, bu iki boyutlu diziler ne için kullanılıyor?"

"Programcı, iki boyutlu dizilere oldukça sık ihtiyaç duyar. Yakından bakarsanız, hemen hemen her masa oyunu, hazır iki boyutlu bir dizi kullanılarak uygulanır: satranç, dama, tic-tac-toe, deniz savaşı, vb.:"

Deniz savaşı

"Anladım! Satranç veya deniz savaşı oyun alanı, iki boyutlu dizilere mükemmel bir şekilde uyuyor!"

"Evet, ancak hücre koordinatları olarak sayıları kullanmanız gerekiyor. 'piyon e2-e4' değil, 'piyon (5,2) -> (5,4)'. Bir programcı olarak sizin için daha da kolay olacak. "

Öğeleri dizilerde düzenleme: (x, y) veya (y, x)

"İki boyutlu diziler oluşturmak ilginç bir ikilem yaratıyor. kullanarak bir dizi oluşturduğumuzda , 'iki satır ve 5 sütunnew int [2][5]; ' tablomuz mu var yoksa 'iki sütun ve 5 satır' mı?"

"Başka bir deyişle, önce genişliği sonra 'yüksekliği mi... yoksa tam tersi, önce yüksekliği ve sonra genişliği mi belirttiğimiz tam olarak açık değil mi?

"Evet, ikilem bu. Kesin bir yanıtı yok."

"Ne yapalım?"

"Öncelikle, iki boyutlu dizimizin gerçekte bellekte nasıl depolandığını anlamak önemlidir . Doğal olarak, bilgisayar belleğinde aslında herhangi bir tablo yoktur: bellekteki her konumun sıralı bir sayısal adresi vardır: 0, 1, 2, ... Bizim için bu 2×5'lik bir tablo ama hafızada sadece 10 hücre, başka bir şey değil, satırlara ve sütunlara bölünme yok.”

"Bunu anladım. Hangi boyutun önce geldiğini nasıl belirleyeceğiz - genişlik mi yükseklik mi?"

"Birinci seçeneği ele alalım. Önce genişlik, sonra yükseklik. " Bu yaklaşımı destekleyen argüman şudur: Herkes okulda matematik öğrenir ve koordinat çiftlerinin 'x' (yani yatay eksen) olarak yazıldığını öğrenir. ve ardından 'y' (dikey boyut). Ve bu sadece bir okul standardı değil, matematikte genel kabul görmüş bir standarttır. Dedikleri gibi, matematikle tartışamazsınız."

"Öyle mi? Peki, eğer onunla mücadele edemiyorsak, o zaman önce genişlik, sonra yükseklik?"

" 'Önce yükseklik, sonra genişlik' lehinde ilginç bir argüman var . Bu argüman, iki boyutlu dizilerin hızlı başlatılmasından geliyor. Sonuçta, dizimizi başlatmak istiyorsak, o zaman şöyle bir kod yazıyoruz:"

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

"Peki bu bizim için ne yapar?"

"Bir şey fark ettin mi? Ya elimizde bu varsa?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

"Verilerimizi kodda satır satır yazarsak 2 satır 5 sütunlu bir tablo elde ederiz."

"Şimdi anlıyorum. 2 yükseklik ve 5 genişlik... Öyleyse hangi seçeneği kullanmalıyız?"

"Hangisinin daha uygun olduğuna karar vermek size kalmış. En önemlisi, aynı proje üzerinde çalışan tüm programcıların aynı yaklaşıma bağlı kalması."

"Kodu çok sayıda başlatılmış iki boyutlu diziye sahip bir proje üzerinde çalışıyorsanız, o zaman büyük olasılıkla oradaki her şey hızlı veri başlatmaya dayalı olacaktır, yani standart 'yükseklik x genişliğe' sahip olacaksınız.

"Kendinizi çok fazla matematik içeren ve koordinatlarla (örneğin oyun motorları) çalışan bir projede bulursanız, kod büyük olasılıkla 'genişlik x yükseklik' yaklaşımını benimser.

İki boyutlu diziler nasıl düzenlenir?

"Şimdi, dersin başında fark ettiğiniz iki boyutlu dizilerin özelliğini hatırlıyor musunuz?"

"Evet! İki boyutlu dizilerin aslında dizi dizileri olduğuydu!"

"Çok doğru. "Başka bir deyişle, sıradan bir dizi söz konusu olduğunda, bir dizi değişkeni dizi öğelerini depolayan bir kaba referans depoluyorsa, o zaman iki boyutlu diziler söz konusu olduğunda durum biraz patlar: iki boyutlu bir dizi. -array değişkeni, tek boyutlu dizilere başvuruları depolayan bir kaba başvuruyu depolar. Yüzlerce kez açıklamaya çalışmaktansa bir kez eylem halinde görmek daha iyidir:"

İki boyutlu diziler nasıl düzenlenir?

"Solda , iki boyutlu bir dizi nesnesine referans depolayan iki boyutlu bir dizi değişkenimiz var. Ortada, hücreleri tek boyutlu dizileri depolayan iki boyutlu bir dizi nesnesi var. iki boyutlu bir dizinin satırları. Ve sağda , dört adet tek boyutlu dizi görebilirsiniz — bizim iki boyutlu dizimizin satırları. İki boyutlu diziler gerçekte böyle çalışır."

"Harika! Ama bize ne veriyor?"

"Bir 'konteyner kabı', 'satır dizileri' referanslarını sakladığından, çok hızlı ve kolay bir şekilde satırları değiştirebiliriz. Bir 'kap kabı' elde etmek için, iki yerine bir dizin belirtmeniz yeterlidir. Örnek:

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

"Aşağıdaki koda bakın. Bunu satırları değiştirmek için kullanabiliriz:"

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
İki boyutlu dizi,





matrix[0]ilk satıra bir referans depolar.
Referansları değiştiriyoruz.

Sonuç olarak, matrixdizi şöyle görünür:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"Anladım. Herhangi iki sıradan eşyayı değiştirmek gibi çalışıyor."

"Öyle. Eh, iki boyutlu bir dizinin bir hücresine başvuruyorsanız, ancak dizinin adından sonra yalnızca bir dizin belirtirseniz, o zaman hücreleri sıradan bir diziye başvuruları depolayan kaplardan oluşan bir kapsayıcıya atıfta bulunuyorsunuz- boyutlu diziler."

"Her şey mantıklı ve net görünüyor. Anlatım için teşekkürler Rishi!"

"Rica ederim. Akıllıca uygulamaya koy."