Diziler

Diziler belirli bir tipteki veri setlerini saklamak için kullanılan yapılardır. Burada bahsedilen “veri seti” ile aslında birden fazla değişkenin bir arada bulunduğu gruplar kastedilmektedir. Örneğin bir sınıfta bulunan öğrenciler bir java dizisi ile temsil edilebilir.

Diziler sayesinde bir değişken kümesini teker teker tanımlamak yerine (var1, var2, var3…) tek bir değişken dizisi tanımlayıp (var[]) bunun içindeki indekslere de değerleri atayabiliriz. Bunu bir benzetme ile de anlatabiliriz. Örneğin ders notlarınızı A4 kağıtlarına yazdığınızı ve bu kağıtları kütüphanenize istiflediğinizi düşünün. Kağıtların birbirine karışması mümkündür ve olasıdır. Ancak bunları bir matbaaya götürüp birleştirseydik ve her sayfaya bir sayfa numarası yazsaydık; yani bunları tek bir yere toplasaydık daha düzenli bir notlar bütününe sahip olurduk. İşte dizileri (array) kullanmak bize böyle bir avantaj sağlamaktadır.

Peki bir dizi nasıl tanımlanır? Daha önceki yazılarımızda * * aslında dizi tanımları yapmıştık. Bu yazımızda bu işin kurallarına biraz daha detaylı değineceğiz. Bir üstteki paragrafta dikkatinizi çekmesi gereken bir var[] ifadesi bulunmakta. Bu bir java dizisini simgeleyen bir ifadedir. Dizilerle ilgili örnekleri yapabilmek için yeni bir proje oluşturuyoruz. İsimlendirme için önceki seçimlerimize benzer bir yaklaşım kullanıyoruz ve projemizi 08 – Arrays olarak adlandırıyoruz. Projemizde TestClass sınıfımızı oluşturup main methodumuzun içini doğrudan doldurmaya başlayacağız.

Diziler iki ayrı şekilde tanımlanabilir. İki ayrı tanım şeklinde de ortak olan parça köşeli parantez kullanımıdır. Diziler köşeli parantezler ile temsil edilir.

String[] stringArray_1; //Tercih edilen sözdizim

String stringArray_2[]; //Alternatif sözdizim

Yukarıda 2 ayrı String dizisinin tanımını görüyorsunuz. Bunların ikisi de aynı sonucu verir. Sözdizim farkı olsa da yaptıkları iş aynıdır. Ancak dikkat ederseniz bunlar sadece tanımlamalardır. Gelin bir de bunlara değer yüklemesi yapalım ya da sıklıkla kullanılan ifade şekliyle bunları initialize edelim. Bunun için tanımların sağ tarafına bir atama operatörü (eşittir) ekleyip alternatif yükleme şekillerine de göz atacağız.

String[] stringArray_1 = new String[2];
stringArray_1[0] = "Value1";
stringArray_1[1] = "Value2";

String stringArray_2[] = {"Value1", "Value2"};

Bu kodda birbiri ile aynı değerleri taşıyan iki ayrı String dizisinin tanımını görmekteyiz. İlk tanımımız new anahtar sözcüğü kullanılarak yapılmış. Atama operatörünün sağ tarafındaki ifadeye dikkat ederseniz köşeli parantez içerisinde 2 yazıldığını görürsünüz. Bu, dizinin 2 elemanlı bir dizi olacağını işaret etmektedir. Javada dizilerin eleman sayısı tanımlama anında verilir ve bu değer değiştirilemez. Bir alt satıra geçtiğimizde ise Value1 değerinin dizinin ilk indeksine atandığını görürüz. Yani stringArray_1 dizisinin ilk elemanı “Value1” değeri olmuştur. Ancak burada dikkatinizi çekmesi gereken nokta köşeli parantezin içerisindeki 0 değeri olmalıdır. Javada dizilerin indeksi 0’dan başlar. Yani n elemanlı bir dizinin ilk indeksi dizi[0] iken, son indeksi dizi[n-1] olacaktır. Bu örnekteki dizinin 3. indeksine bir atama yapmaya çalışarak hata almaya çalışın. Böylece bir dizinin sonradan genişletilemeyeceği sonucunu gözlemleyebileceksiniz.

İkinci dizimizin tanımlanma şekline baktığımızda ise dizinin doğrudan yüklendiğini görürüz. Dizinin ilk ve ikinci indeksine sırasıyla “Value1” ve “Value 2” değerleri yüklenmiştir. Dikkat ederseniz bu tanımlama şeklinde bir maksimum indeks veya boyut tanımı yapılmamıştır. Ancak kurallarımız burada da geçerlidir. Bu dizinin boyutu bu tanımla birlikte 2 olarak belirlenmiştir.

Dizilerin boyutları sabit olsa da elemanları değiştirilebilir. Örneğin aşağıdaki sayı dizisine baktığımızda 6 elemanlı bir dizi görürüz. Bu dizinin 6. elemanı, yani 5.indeksi, 8 değerini taşımaktadır. Bunu ekrana yazdırıp ardından 5. indekse yeni bir değer ataması yapıyoruz. Ardından indeksin değerini ekrana tekrar yazdırıyoruz. Bu kod hem derleme hatası vermez, hem de gözlemlemek istediğimiz durumu bize gösterir.

int[] intArray = {1,1,2,3,5,8};

System.out.println(intArray[5]);

intArray[5] = 13;

System.out.println(intArray[5]);
Çıktı:
8
13

Bu örnek ile birlikte bir dizinin elemanlarını nasıl kullanabileceğimizi de gördük. Bu noktada pratik olması açısından tekrar döngüler* * ile ilgili yazılarımıza göz atmanızı öneriyorum.

Bir de kompleks nesne tipleriyle dizileri kullanalım. Örneğin bir Derslik sınıfı yazalım ve bir de Ogrenci sınıfı kodlayalım. Bu sınıfları oldukça basit tutacağım. Ana amacımız derslikleri bir dizide tutmak ve bu dersliklerde de öğrencileri birer dizi olarak saklamak olacak. Öncelikle Ogrenci sınıfı ile başlıyorum. Bir öğrenciye dair özellikleri, basit tutarak, isim ve numara olarak belirleyelim. Buna istinaden kurguladığımız sınıfı önce kendi başınıza kodlamaya çalışın. Ardından aşağıdaki sınıf ile karşılaştırın.

public class Ogrenci {

	private String isim;
	
	private int no;

	public String getIsim() {
		return isim;
	}

	public void setIsim(String isim) {
		this.isim = isim;
	}

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}
}

Ardından öğrencileri tutacak bir Derslik sınıfını kodlayalım. Bu sınıfın özellikleri ise kat bilgisi ve içindeki öğrenciler olsun. Öğrencilerin bir dizi olduğunu aklınızda bulundurarak sınıfı kodlamaya çalışın. Benzer bir şekilde sonrasında aşağıdaki örneğe bakabilirsiniz.

public class Derslik {
	
	private int kat;
	
	private Ogrenci[] ogrenciler;

	public int getKat() {
		return kat;
	}

	public void setKat(int kat) {
		this.kat = kat;
	}

	public Ogrenci[] getOgrenciler() {
		return ogrenciler;
	}

	public void setOgrenciler(Ogrenci[] ogrenciler) {
		this.ogrenciler = ogrenciler;
	}
}

Bu sınıfın öğrencilerine dair getter ve setter methodlarına baktığımızda görürüz ki methodlar, dizileri input olarak alabilir ve geri dönüş tipi olarak imzasında barındırabilir. Yani diziler hem objeleri/tipleri bir arada tutan bir yapıdır, hem de kendisi de bir obje/tip olarak kullanılır.

Şimdi de yöneteceğimiz durumu konuşalım. Uygulamamızda 5 adet öğrencimiz olsun. Bunların üçü bir derslikte diğer ikisi ise diğer derslikte olsun. Derslikler ise 3. ve 4. katlarda bulunacaktır.

Amacımız ise dersikleri ve öğrencileri sırasıyla ekrana yazdırmaktır. Ancak bunu şu şekilde yapacağız. Ekrana dersliğin katını yazdırdıkan hemen sonra o dersliğin öğrencilerini yazdıracağız. Ardından da diğer dersliğe ve öğrencilerine geçeceğiz. Bunu iç içe 2 döngü ile halledeceğiz. Kodumuza geçmeden önerim, örneği kendi kendinize yapmanızdır.

//Ogrenci tanımları

Ogrenci ogrenci1 = new Ogrenci();
ogrenci1.setIsim("Schumacher");
ogrenci1.setNo(1);

Ogrenci ogrenci2 = new Ogrenci();
ogrenci2.setIsim("Alonso");
ogrenci2.setNo(2);

Ogrenci ogrenci3 = new Ogrenci();
ogrenci3.setIsim("Kimi");
ogrenci3.setNo(3);

Ogrenci ogrenci4 = new Ogrenci();
ogrenci4.setIsim("Montoya");
ogrenci4.setNo(4);

Ogrenci ogrenci5 = new Ogrenci();
ogrenci5.setIsim("Button");
ogrenci5.setNo(5);

Ogrenci[] ogrenciArray1 = {ogrenci1, ogrenci2, ogrenci3};

Ogrenci[] ogrenciArray2 = new Ogrenci[2];
ogrenciArray2[0] = ogrenci4;
ogrenciArray2[1] = ogrenci5;

//Derslik tanımları

Derslik derslik1 = new Derslik();
derslik1.setKat(3);
derslik1.setOgrenciler(ogrenciArray1);

Derslik derslik2 = new Derslik();
derslik2.setKat(4);
derslik2.setOgrenciler(ogrenciArray2);

Derslik[] derslikler = {derslik1, derslik2};

for(Derslik derslik: derslikler) {
	
	System.out.println("Derslik kat: " + derslik.getKat());
	
	for(Ogrenci ogrenci: derslik.getOgrenciler()) {
		System.out.println("Ogrenci no: " + ogrenci.getNo());
		System.out.println("Ogrenci ismi: " + ogrenci.getIsim());
	}
	
	System.out.println("-------------------");
}
Çıktı:
Derslik kat: 3
Ogrenci no: 1
Ogrenci ismi: Schumacher
Ogrenci no: 2
Ogrenci ismi: Alonso
Ogrenci no: 3
Ogrenci ismi: Kimi
-------------------
Derslik kat: 4
Ogrenci no: 4
Ogrenci ismi: Montoya
Ogrenci no: 5
Ogrenci ismi: Button

Bu örnek ile beraber diziler yazımızı sonlandırabiliriz. Burada özellikle odaklanmanız gereken şey dizilerin kullanım amacıdır. Nasıl döngüler sizi iterasyonlar sayesinde aynı kodu tekrar tekrar yazmaktan kurtarıyorsa, diziler de birden fazla değişkeni gruplayarak bu tarz tekrar durumlardan kaçmanıza olanak yaratmaktadır. Aşağıda bütün TestClass sınıfımızı paylaşıyorum. Sınıfı ornek1 ve ornek 2 olmak üzere iki ayrı method ile doldurdum. Kod üzerinde istediğinizi gibi oynayıp, farklı çıktılar almayı deneyebilirsiniz. Bir sonraki yazımızda görüşmek üzere.

public class TestClass {

	public static void main(String[] args) {

		ornek1();

		ornek2();

	}

	private static void ornek1() {

		String[] stringArray_1 = new String[2];
		stringArray_1[0] = "Value1";
		stringArray_1[1] = "Value2";

		String stringArray_2[] = { "Value1", "Value2" };
		System.out.println(stringArray_2[0]);

		int[] intArray = { 1, 1, 2, 3, 5, 8 };

		System.out.println(intArray[5]);

		intArray[5] = 13;

		System.out.println(intArray[5]);

	}

	private static void ornek2() {

		// Ogrenci tanımları

		Ogrenci ogrenci1 = new Ogrenci();
		ogrenci1.setIsim("Schumacher");
		ogrenci1.setNo(1);

		Ogrenci ogrenci2 = new Ogrenci();
		ogrenci2.setIsim("Alonso");
		ogrenci2.setNo(2);

		Ogrenci ogrenci3 = new Ogrenci();
		ogrenci3.setIsim("Kimi");
		ogrenci3.setNo(3);

		Ogrenci ogrenci4 = new Ogrenci();
		ogrenci4.setIsim("Montoya");
		ogrenci4.setNo(4);

		Ogrenci ogrenci5 = new Ogrenci();
		ogrenci5.setIsim("Button");
		ogrenci5.setNo(5);

		Ogrenci[] ogrenciArray1 = { ogrenci1, ogrenci2, ogrenci3 };

		Ogrenci[] ogrenciArray2 = new Ogrenci[2];
		ogrenciArray2[0] = ogrenci4;
		ogrenciArray2[1] = ogrenci5;

		// Derslik tanımları

		Derslik derslik1 = new Derslik();
		derslik1.setKat(3);
		derslik1.setOgrenciler(ogrenciArray1);

		Derslik derslik2 = new Derslik();
		derslik2.setKat(4);
		derslik2.setOgrenciler(ogrenciArray2);

		Derslik[] derslikler = { derslik1, derslik2 };

		for (Derslik derslik : derslikler) {

			System.out.println("Derslik kat: " + derslik.getKat());

			for (Ogrenci ogrenci : derslik.getOgrenciler()) {
				System.out.println("Ogrenci no: " + ogrenci.getNo());
				System.out.println("Ogrenci ismi: " + ogrenci.getIsim());
			}

			System.out.println("-------------------");
		}

	}

}

Leave a Reply

Your email address will not be published. Required fields are marked *