1. İki boyutlu diziler

Diziler hakkında bir ilginç gerçek daha. Diziler yalnızca tek boyutlu (doğrusal) değildir. İki boyutlu da olabilirler.

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];

Burada ad, dizi değişkeninin adıdır, genişlik tablo genişliğidir (hücrelerde) ve yükseklik tablo yüksekliğidir. Örnek:

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.

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

İki boyutlu diziler

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

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

Bir programcı olarak iki boyutlu bir diziye ihtiyaç duyabileceğiniz pek çok yer var. İki boyutlu diziler, satranç, dama, tic-tac-toe ve deniz savaşı gibi hemen hemen her masa oyununun temelidir:

İki boyutlu diziler 2

İki boyutlu diziler, satranç veya deniz savaşı için mükemmeldir. Sadece hücre koordinatlarından sayılara ihtiyacımız var. 'e2-e4 piyonu' değil, 'piyon (5,2) -> (5,4)'. Bir programcı olarak sizin için daha da kolay olacaktır.


2. Öğeleri dizi halinde düzenleme: (x, y) veya (y, x)

Bu arada burada ilginç bir ikilem var:

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ı ?" Yani önce genişliği sonra yüksekliği mi belirliyoruz... veya tam tersi, önce yükseklik, sonra genişlik Peki, sık sık söylediğimiz gibi, burada her şey o kadar basit değil.

Dizinin bellekte nasıl saklandığı sorusuyla başlayalım .

Elbette, bilgisayar belleğinde aslında bir matris yoktur: bellekteki her konumun sıralı bir sayısal adresi vardır: 0, 1, 2, ... Bizim durumumuzda 2 × 5'lik bir matristen bahsediyoruz, ancak bellekte sadece 10 ardışık hücre, başka bir şey değil. Hiçbir şey satırların ve sütunların nerede olduğunu göstermez.

"Genişlik x yükseklik" lehine argüman.

Bu yaklaşımın lehine olan argüman, herkesin okulda matematiği, koordinat çiftlerinin 'x' (yani yatay eksen) ve sonra 'y' (dikey boyut) olarak yazıldığını öğrendikleri yerde öğrenmesidir. Ve bu sadece bir okul standardı değil, matematikte genel kabul görmüş bir standarttır. Dedikleri gibi, matematikle tartışamazsınız. Böylece? Önce genişlik sonra yükseklik?

"Yükseklik x genişlik" lehine argüman.

Bu pozisyon için yapılacak ilginç bir argüman da var: iki boyutlu dizilerin hızlı başlatılması. Aslında, dizimizi başlatmak istiyorsak, şöyle bir kod yazabiliriz:

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

Hiçbir şey fark etmiyor musun? Ya buna sahipsek?

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

Verilerimizi kod satırına satır satır yazarsak 2 satır 5 sütunlu bir matris elde ederiz.

Sonuç olarak

Ne söyleyebiliriz? Hangisinin sizin için 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ıdır.

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

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


3. İki boyutlu diziler nasıl düzenlenir?

Ve şimdi iki boyutlu dizilerin gerçekte nasıl düzenlendiğini öğreneceksiniz. Hazır?

İki boyutlu diziler aslında dizi dizileridir!

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 değişkeni, bir tek boyutlu dizilere başvuruları depolayan bir kapsayıcıya başvuru. 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 . İçindeortada , hücreleri iki boyutlu bir dizinin satırları olan tek boyutlu dizileri depolayan iki boyutlu bir dizi nesnesine sahibiz. Ve sağda , dört adet tek boyutlu dizi görebilirsiniz — iki boyutlu dizimizin satırları.

İki boyutlu diziler gerçekte böyle çalışır. Ve bu yaklaşım, Java programcısına çeşitli avantajlar sağlar:

İlk olarak , bir 'konteyner kabı', 'satır dizilerine' referansları sakladığından, çok hızlı ve kolay bir şekilde satırları değiştirebiliriz. Bir 'konteyner kabı' almak için iki yerine bir dizin belirtmeniz yeterlidir. Örnek:

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

Bu kod, satırları değiştirmenize izin verir:

// 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}
};

İki boyutlu bir dizinin bir hücresine başvurursanız, ancak dizinin adından sonra yalnızca bir dizin belirtirseniz, o zaman hücreleri sıradan tek boyutlu dizilere başvuruları depolayan bir kapsayıcıya atıfta bulunuyorsunuz demektir.