← Kursa Dön
📄 Text · 12 min

Çok Boyutlu Diziler

Giriş

Tek boyutlu diziler bir listeyi tutar — öğrenci notları, şehir isimleri, günlük sıcaklıklar. Ama ya bir tablo tutmak istersen? Mesela 4 öğrencinin 3 dersten aldığı notlar? Veya bir satranç tahtasının 8x8 karesi?

İşte burada çok boyutlu diziler devreye giriyor. Java'da en yaygın kullanılan çok boyutlu dizi 2 boyutlu (2D) dizidir. Daha yüksek boyutlar da mümkün ama pratikte nadiren kullanılır.

2D Dizi Nedir?

2D diziyi bir Excel tablosu gibi düşün. Satırlar ve sütunlar var. Her hücreye ulaşmak için iki bilgiye ihtiyacın var: satır numarası ve sütun numarası.

Teknik olarak Java'da 2D dizi, dizilerin dizisidir. Yani bir dizi var, onun her elemanı da başka bir dizi. Ama kafanı karıştırmasın — pratikte bunu satır-sütun tablosu gibi kullanıyorsun.

         Sütun 0   Sütun 1   Sütun 2
Satır 0  [  10  ] [  20  ] [  30  ]
Satır 1  [  40  ] [  50  ] [  60  ]
Satır 2  [  70  ] [  80  ] [  90  ]

Bu 3x3'lük bir tablo. tablo[1][2] dediğinde → Satır 1, Sütun 2 → değer: 60.

2D Dizi Tanımlama

Yol 1: Boyut Belirterek

int[][] matris = new int[3][4];  // 3 satır, 4 sütun

Bu, 3 satır ve 4 sütunluk bir tablo oluşturur. Tüm değerler 0 olarak başlar.

Yol 2: Değerlerle Birlikte

int[][] matris = {
    {10, 20, 30},
    {40, 50, 60},
    {70, 80, 90}
};

Her süslü parantez bir satırı temsil ediyor. Bu örnekte 3 satır, 3 sütun var.

Yol 3: new ile Değerli

int[][] matris = new int[][] {
    {1, 2, 3},
    {4, 5, 6}
};

Elemanlara Erişim

İlk indeks satır, ikinci indeks sütun:

int[][] notlar = {
    {90, 85, 78},   // 0. öğrenci
    {72, 68, 80},   // 1. öğrenci
    {95, 92, 88}    // 2. öğrenci
};

System.out.println(notlar[0][0]);  // 90 — 0. öğrenci, 0. ders
System.out.println(notlar[1][2]);  // 80 — 1. öğrenci, 2. ders
System.out.println(notlar[2][1]);  // 92 — 2. öğrenci, 1. ders

// Değer güncelleme
notlar[1][0] = 75;  // 1. öğrencinin 0. ders notu 75 oldu

Satır ve Sütun Sayısı

int[][] matris = new int[3][4];

System.out.println("Satır sayısı: " + matris.length);       // 3
System.out.println("Sütun sayısı: " + matris[0].length);    // 4

matris.length → satır sayısı (dış dizinin boyutu) matris[0].length → 0. satırın sütun sayısı (iç dizinin boyutu)

2D Dizi Üzerinde Gezinme

İç İçe for Döngüsü

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

for (int i = 0; i < matris.length; i++) {           // satırlar
    for (int j = 0; j < matris[i].length; j++) {    // sütunlar
        System.out.print(matris[i][j] + "\t");
    }
    System.out.println();  // satır sonu
}

Çıktı:

1	2	3
4	5	6
7	8	9

Dış döngü satırları, iç döngü sütunları geziyor. Her satır bittiğinde println() ile alt satıra geçiyoruz.

İç İçe for-each

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

for (int[] satir : matris) {         // her satır bir int dizisi
    for (int eleman : satir) {       // satırdaki her eleman
        System.out.print(eleman + "\t");
    }
    System.out.println();
}

for-each versiyonu daha okunabilir. Ama yine aynı kural: indeks lazımsa veya eleman değiştireceksen klasik for kullan.

Pratik Örnek: Öğrenci Not Tablosu

String[] ogrenciler = {"Ali", "Ayse", "Mehmet"};
String[] dersler = {"Matematik", "Fizik", "Kimya"};

int[][] notlar = {
    {90, 85, 78},
    {72, 68, 80},
    {95, 92, 88}
};

// Her öğrencinin ortalamasını hesapla
for (int i = 0; i < ogrenciler.length; i++) {
    int toplam = 0;
    for (int j = 0; j < dersler.length; j++) {
        toplam += notlar[i][j];
    }
    double ortalama = (double) toplam / dersler.length;
    System.out.println(ogrenciler[i] + " ortalaması: " + ortalama);
}

Çıktı:

Ali ortalaması: 84.33333333333333
Ayse ortalaması: 73.33333333333333
Mehmet ortalaması: 91.66666666666667

Bu örnek 2D dizilerin en klasik kullanım senaryosu: satırlar varlıkları (öğrenciler), sütunlar özellikleri (dersler) temsil ediyor.

Matris İşlemleri

Matris Toplama

İki matrisin toplanması: aynı konumdaki elemanlar toplanır.

int[][] a = {
    {1, 2, 3},
    {4, 5, 6}
};

int[][] b = {
    {7, 8, 9},
    {10, 11, 12}
};

int[][] toplam = new int[2][3];

for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < a[0].length; j++) {
        toplam[i][j] = a[i][j] + b[i][j];
    }
}

// Sonuç: {{8,10,12}, {14,16,18}}

Matris Transpozu

Transpozu almak: satırlar sütun, sütunlar satır olur.

int[][] matris = {
    {1, 2, 3},
    {4, 5, 6}
};
// 2x3 matris → transpozu 3x2 olacak

int[][] transpoze = new int[matris[0].length][matris.length];

for (int i = 0; i < matris.length; i++) {
    for (int j = 0; j < matris[0].length; j++) {
        transpoze[j][i] = matris[i][j];
    }
}

// Sonuç: {{1,4}, {2,5}, {3,6}}

Dikkat: transpoze[j][i] = matris[i][j] — indeksler yer değiştiriyor.

Köşegen Toplamı

Kare matrisin ana köşegen elemanlarının toplamı:

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

int kosegenToplam = 0;
for (int i = 0; i < matris.length; i++) {
    kosegenToplam += matris[i][i];  // [0][0], [1][1], [2][2]
}

System.out.println("Köşegen toplamı: " + kosegenToplam); // 1+5+9 = 15

Ana köşegen elemanlarında satır indeksi = sütun indeksi. Bu yüzden matris[i][i] yeterli.

Jagged Array (Düzensiz Dizi)

Normal 2D dizide her satırın sütun sayısı aynıdır. Ama Java'da her satırın farklı uzunlukta olmasına izin verilir. Buna jagged array (pürüzlü dizi) denir.

int[][] jagged = new int[3][];  // 3 satır, ama sütun sayısı belirsiz

jagged[0] = new int[]{1, 2};           // 2 eleman
jagged[1] = new int[]{3, 4, 5, 6};     // 4 eleman
jagged[2] = new int[]{7, 8, 9};        // 3 eleman
Satır 0: [1] [2]
Satır 1: [3] [4] [5] [6]
Satır 2: [7] [8] [9]

Jagged Array Üzerinde Gezinme

for (int i = 0; i < jagged.length; i++) {
    for (int j = 0; j < jagged[i].length; j++) {  // her satırın kendi length'i
        System.out.print(jagged[i][j] + " ");
    }
    System.out.println();
}

⚠️ Dikkat: Jagged array'de jagged[0].length ile jagged[1].length farklı olabilir. Bu yüzden iç döngüde her zaman jagged[i].length kullan, sabit bir sayı yazma.

Ne Zaman Jagged Array Kullanılır?

  • Üçgen matrisler

  • Her öğrencinin farklı sayıda ödevi varsa

  • Kelime grupları (her grup farklı uzunlukta)

Pratikte jagged array çok sık kullanılmaz. Ama sınavlarda ve mülakatlarda sorulur, bilmen gerekir.

Pratik Örnek: Tic-Tac-Toe Grid

Basit bir XOX oyun tahtası:

char[][] tahta = {
    {' ', ' ', ' '},
    {' ', ' ', ' '},
    {' ', ' ', ' '}
};

// Hamle yap
tahta[0][0] = 'X';  // X sol üst köşeye
tahta[1][1] = 'O';  // O ortaya
tahta[0][2] = 'X';  // X sağ üst köşeye

// Tahtayı yazdır
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        System.out.print(" " + tahta[i][j] + " ");
        if (j < 2) System.out.print("|");
    }
    System.out.println();
    if (i < 2) System.out.println("-----------");
}

Çıktı:

 X |   | X
-----------
   | O |  
-----------
   |   |  

Kazanan Kontrolü

static boolean kazandiMi(char[][] tahta, char oyuncu) {
    // Satır kontrolü
    for (int i = 0; i < 3; i++) {
        if (tahta[i][0] == oyuncu && tahta[i][1] == oyuncu && tahta[i][2] == oyuncu) {
            return true;
        }
    }

    // Sütun kontrolü
    for (int j = 0; j < 3; j++) {
        if (tahta[0][j] == oyuncu && tahta[1][j] == oyuncu && tahta[2][j] == oyuncu) {
            return true;
        }
    }

    // Çapraz kontrol
    if (tahta[0][0] == oyuncu && tahta[1][1] == oyuncu && tahta[2][2] == oyuncu) return true;
    if (tahta[0][2] == oyuncu && tahta[1][1] == oyuncu && tahta[2][0] == oyuncu) return true;

    return false;
}

Bu örnek 2D dizinin gerçek hayatta nasıl kullanıldığını güzel gösteriyor. Oyun tahtaları, grid tabanlı uygulamalar hep 2D diziyle yapılır.

2D Diziyi Yazdırma

Tek boyutlu dizilerde Arrays.toString() kullandık. 2D dizilerde ise Arrays.deepToString() lazım:

import java.util.Arrays;

int[][] matris = {
    {1, 2, 3},
    {4, 5, 6}
};

System.out.println(Arrays.toString(matris));      // [[I@..., [I@...] — işe yaramaz
System.out.println(Arrays.deepToString(matris));   // [[1, 2, 3], [4, 5, 6]] — güzel!

💡 İpucu: Çok boyutlu dizilerde her zaman deepToString() ve deepEquals() kullan. Normal toString() ve equals() sadece tek boyutlu dizilerde çalışır.

3 ve Daha Fazla Boyut

Java'da istediğin kadar boyut ekleyebilirsin, ama pratikte 3D bile nadir kullanılır:

int[][][] kup = new int[3][3][3];
kup[0][1][2] = 42;

// Gezinme: 3 iç içe döngü
for (int i = 0; i < kup.length; i++) {
    for (int j = 0; j < kup[i].length; j++) {
        for (int k = 0; k < kup[i][j].length; k++) {
            System.out.print(kup[i][j][k] + " ");
        }
    }
}

3D dizi kullanım alanları: 3D grafik, voksel tabanlı oyunlar (Minecraft gibi), bilimsel simülasyonlar. Ama başlangıç seviyesinde 2D dizi yeterli.

2D Dizileri Metotlara Geçirme

static void matrisiYazdir(int[][] matris) {
    for (int[] satir : matris) {
        for (int eleman : satir) {
            System.out.printf("%4d", eleman);
        }
        System.out.println();
    }
}

static int[][] sifirMatris(int satir, int sutun) {
    return new int[satir][sutun];
}

// Kullanım
int[][] m = {{1, 2}, {3, 4}};
matrisiYazdir(m);

Tıpkı tek boyutlu diziler gibi, 2D diziler de referans olarak geçirilir. Metot içinde yaptığın değişiklikler orijinal diziyi etkiler.

Yaygın Hatalar

Hata 1: Satır ve sütun karıştırmak

int[][] m = new int[3][5];  // 3 satır, 5 sütun
// m[4][2] — HATA! 4. satır yok (max indeks 2)
// m[2][4] — doğru, son satırın son sütunu

Hata 2: Jagged array'de sabit sütun varsaymak

int[][] j = new int[3][];
j[0] = new int[2];
j[1] = new int[5];
// j[1][4] geçerli, ama j[0][4] HATA!

Hata 3: deepToString yerine toString kullanmak

int[][] m = {{1,2},{3,4}};
System.out.println(Arrays.toString(m));      // [[I@..., [I@...]
System.out.println(Arrays.deepToString(m));  // [[1, 2], [3, 4]]

Özet

  • 2D dizi, satır ve sütunlardan oluşan tablo yapısıdır — int[][] matris = new int[satir][sutun]

  • Elemanlara matris[satir][sutun] ile erişilir, indeksler 0'dan başlar

  • Jagged array ile her satır farklı uzunlukta olabilir

  • Gezinme için iç içe döngü kullanılır: dış döngü satır, iç döngü sütun

  • 2D diziyi yazdırmak için Arrays.deepToString(), karşılaştırmak için Arrays.deepEquals() kullan

  • Pratikte 2D yeterli; 3D ve üzeri nadiren kullanılır