Ç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ütunBu, 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 olduSatı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); // 4matris.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 9Dış 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.66666666666667Bu ö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 = 15Ana 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 elemanSatı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ütunuHata 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şlarJagged 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çinArrays.deepEquals()kullanPratikte 2D yeterli; 3D ve üzeri nadiren kullanılır
AI Asistan
Sorularını yanıtlamaya hazır