15 KASIM 2017
ÇARŞAMBA
20.08
Java - Diziler (Arrays)

Java programlama dilinde dizilerin nasıl oluşturulduğu ve kullanıldığına değineceğiz.

 

Diziler, aynı veri tipine sahip birden fazla değeri barındırabilen nesnelerdir. Bu sebeple oldukça kullanışlıdırlar.

Elimizde 15 kişilik bir sınıfın veri yapıları dersinden aldıkları notların ortalamasını yani sınıfın o dersteki ortalamasını bulmak istediğimizde her öğrenci için tek tek değişken açıp notunu girmektense tek bir dizi oluşturup öğrencilerin notlarını tek tek girmek daha mantıklıdır. Bu sebeple diziler işlemleri kolaylaştırmak ve kod kalabalığından kurtulmak amacıyla oldukça önemlidir.

Dizi Oluşturmak

veriTipi[] diziAdi = new veriTipi[elemanSayisi];

Şeklinde bir dizi tanımlayabiliriz.

Diziler hakkında dikkat edelim: Bir Dizinin ilk elemanı 0. elemanıdır.


int[] dizi = new int[15];
dizi[1] = 50;
System.out.println(dizi[1]);

gibi bir kullanım ile dizilere değer atayarak atanan değere ulaşabiliriz.


Veya doğrudan şöyle bir kullanım ile değerleri atayabiliriz;

int[] dizi = {5,10,15,20,25,30,35,40,45,50,55,60,65,70};
System.out.println(dizi[1]);

ÖRNEK

Bilgisayar 1 ile 100 arasında rastgele 10 sayı üretiyor. Üretilen sayıları bir dizi içerisine kayıt edin. Sonrasında diziye kayıt edilen sayıları herhangi bir sıralama algoritması ile sıralayın ve sonrasında ekrana çıktı verin.

ÇÖZÜM

int[] dizi = new int[10];
for(int i=0; i<10; i++) {
	Random rastgele = new Random();
	int sayi = rastgele.nextInt(100)+1;
	dizi[i] = sayi;
}
for(int k=1; k<10; k++) {
	int gecici;
	for(int j=0; j<10-k; j++) {
		if(dizi[j] > dizi[j+1]) {
			gecici = dizi[j];
			dizi[j] = dizi[j+1];
			dizi[j+1] = gecici;
		}
	}
}

for(int m=0; m<10; m++) {
	if(m != 9) {
		System.out.print(dizi[m]+" - ");
	} else {
		System.out.print(dizi[m]);
	}
}

ÇIKTI

5 - 30 - 50 - 61 - 65 - 76 - 84 - 87 - 90 - 99

Dizinin Uzunluğu: length

Dizinin kaç elemandan oluştuğunu bulmak için .length kullanabiliriz. Burada kullandığımız lenght ile String için kullandığımızı karıştırmayın!

System.out.println(dizi.length);

ÖRNEK

Öğrencilerin almış olduğu notların ortalaması hesaplayan bir ortalama methodu yazın. Notları dizi içerisinde tutup methoda diziyi gönderin.

ÇÖZÜM

public static void main(String[] args) {

	int[] notlar = {50,45,74,36,93,25,34};
	System.out.println("Notlar: "+Arrays.toString(notlar));
	System.out.println("Not Ortalaması: "+ortalama(notlar));
	Array.sort(notlar);
}

public static double ortalama(int[] notlar) {
	int ortalama = 0;
	for(int i=0; i<notlar.length; i++) {
		ortalama = ortalama+notlar[i];
	}
	ortalama = ortalama/notlar.length;
	return (double) ortalama;
}

ÇIKTI

Notlar: [50, 45, 74, 36, 93, 25, 34]
Not Ortalaması: 51.0

Çözümde kullanılan Arrays.toString(notlar) bölümü bir dizinin elemanlarının String gibi algılanıp doğrudan ekrana yazdırılmasını sağlar ve bu örnek için [50, 45, 74, 36, 93, 25, 34] çıktısını verir.

Dizinin Tersi : reverse

Bu işlemi basit olarak şöyle ifade edebiliriz;

A: 1,2,3,4,5
İstenen: 5,4,3,2,1

Reverse fonksiyonunda çok önemli bir detay vardır. Bu detay for döngüsü ile yapılan bu işlemde dizinin ortasına kadar işlemin gerçekleşmesi gerektiğidir. Çünkü mantıken ortanca elemandan sonra tekrar eskisi gibi dizilmeye başlanacak ve dizi ne yazık ki istenildiği gibi ters dönmeyecektir. Örneğimizi inceleyelim;

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

for(int i=0; i<siralama.length/2; i++) {
	int gecici = siralama[i];
	siralama[i] = siralama[siralama.length-i-1];
	siralama[siralama.length-i-1] = gecici;
}

Diziler ile Metotların Kullanımı

Zaman zaman karışıklığın yaşanabileceği bu kısmı tüm detayları ile öğrenmek faydalı olacaktır. Dikkatlice inceliyoruz.

Diziyi Metot İçinde Kullanma Şekilleri

a. Geri Döndürülecek Değer Dizi Değil ise

Eğer main içinden gönderilmiş bir diziyi metodumuz içinde kullanıp geriye döndürürken yalnızca bir değişken ile aktarmamız gerekiyorsa bu yöntemi tercih ederiz. Örnek ile daha iyi pekişecektir;

Kullanının ders notlarını bir dizi içinde sakladığını varsayalım. Bu ders notlarının ortalamasını hesaplayan bir metot yazmamız gerekiyor. Dolayısıyla metodun geri döndüreceği değer yalnızca bir sayıdan ibaret olacaktır. Yani diziyi tekrar geriye döndürmesine gerek yok!

public static float ortalama(int[] a) {
	float toplam = 0;
	for(int i=0; i<a.length; i++) {
		toplam = toplam+a[i];
	}
	return toplam/a.length;
}

public static void main(String[] args) {
	int[] dersNotlarim = {75,90,40};
	float ortalamam = ortalama(dersNotlarim);
	System.out.println("Ortalamam: "+ortalamam);
}

b. Geri Döndürülecek Değer Dizi ise

Eğer main içinden gönderilmiş bir dizi veya değişkene bağlı olarak geriye döndürmek istediğimiz değer bir diziyi temsil ediyor ise bu yöntemi tercih ederiz.

Kullanıcı metoda bir sayı göndersin. Gönderilen sayıdan başlayarak her basamakta +2 arttırılsın ve 100'e kadar bir değer oluşturulup diziye kaydedilsin. Kaydedilen dizi main fonksiyonuna geri gönderilsin. Böyle bir uygulamayı yazarken geriye döndürelen değerin yine bir dizi olduğunu görüyoruz. Dikkatlice örneği inceleyelim;

public static int[] arttir(int baslangic) {
	int elemanSayisi = ((100-baslangic)/2)+1;
	int[] dizi = new int[elemanSayisi];
	for(int i=baslangic, j=0; i<=100; i+=2, j++) {
		dizi[j] = i;
	}
	return dizi;
}

public static void main(String[] args) {
	int[] sayilarim = arttir(52);
	for(int i=0; i<sayilarim.length; i++) {
		System.out.print(sayilarim[i]+"-");
	}
}

Yukarıdaki kod yapımızda dikkat etmemiz gereken ana nokta arttir metodunun oluşturulduğu alandır:

--> public static int [ ] arttir

Bu alan dışında kod içerisinde kullanılan ve daha önce görmediğimiz for döngüsünde iki değişkenin kullanımına da tanıklık ediyoruz. Birden fazla değişkeni aynı for döngüsü girdisinde kullanabiliriz.

Ayrıca elemanSayisi hesaplanırken gelen başlangıç değerinden 100'e kadar gidileceği için ve 2 şer artacağı için böyle bir uygulama tercih edilir. +1 ise elemanSayısı'nın çift ve teke bağlı olarak değişiklik göstermesidir.

Takas ve Referans Mantığı ve Diziler ile Örnekleri

Takas olarak adlandırdığımız ve daha çok swap olarak bilinen işlemi aslında sürekli olarak yapıyoruz;

int gecici = a;
a = b;
b = gecici;

şeklinde kullanıyoruz ve böylece a'nın değeri b'ye, b'nin değeri a'ya geçiyor. Örneğin: a:1 b:2 ise sonuçta a:2 b:1 oluyor.

Fakat bu işi referans mantığına dökersek işler biraz değişiyor. Örneği dizi üzerinden verme sebebimiz diziler saklandıkları konum itibari ile çağırılırken hafızada tutuldukları adresler ile çağırılırlar. Dolayısıyla şöyle iki adet dizi oluşturduğumuz varsayalım;

int[] dizi1 = {10,20,30};
int[] dizi2 = dizi1;

Oluşturduğumuz bu dizilerden herhangi birinde yapacağımız değişiklik her iki dizi öğesini de etkileyecektir. Çünkü ikinci satırda yaptığımız işlem ile aslında dizi1'in başlangıç adresini dizi2'ye atıyoruz. İçeriğini değiştirdiğimiz zaman ise o adresteki değer değişiyor ve sonuçta o adresi çağıran her yerde değişmiş oluyor.

int[] dizi1 = {10,20,30};
int[] dizi2 = dizi1;
dizi1[0] = 1000;

System.out.println(Arrays.toString(dizi1));
System.out.println(Arrays.toString(dizi2));

Kodumuzun çıktısı;

[1000, 20, 30]
[1000, 20, 30]

olmuş oluyor.

YORUMLAR 0
Bu konuya henüz kimse yorum yapmadı.
İlk yorumu sen yapmak ister misin?
YORUM BIRAK
Şuanda bu yoruma cevap yazıyorsunuz:
İptal Et