Bil 102 Bölüm 6 Diziler
Diziler Örn. 40 tane öğrencinin son not ortalamasını tutmak gerekiyor. double ogrenci1 = 65.5; double ogrenci2 = 45; double ogrenci3 = 83.5; double ogrenci4 = 66; … double [ ] notlar = new double [40]; ? double ogrenci40 = 91;
Dizi Aynı veri türüne veya sınıfa ait birbirleri ile ilişkili veriler topluluğu. Dizinin elemanları basit veri türüne ait veya nesneye ait olabilir. Bu duruma göre hafızada uygun yer ayrılır. veri_türü [ ] dizi_adı = new veri_türü [dizi_uzunluğu] ; int [] a = new int[10];
Dizi Dizilerde indisler 0’dan başlar. String de olduğu gibi, uzunluğu 5 olan bir dizinin ilk elemanının indisi (bulunduğu pozisyon) 0, son elemanının indisi 4 olur. Örn. 7 günlük sıcaklık derecelerini tutmak istersek: int gun1, gun2, gun3, gun4, gun5, gun6, gun7; int [ ] sicaklik = new int [7]; 7 adet int tipinde değişken tanımlamaya eşdeğerdir: sicaklik[0], sicaklik[1], sicaklik[2], sicaklik[3], sicaklik[4], sicaklik[5], sicaklik[6]
Dizi Dizi tanımlandıktan sonra her bir elemanına değer atanabilir: sicaklik[0] = 7; sicaklik[1] =4; sicaklik[2] =-1; sicaklik[3] =-3; sicaklik[4] =0; sicaklik[5] =2; sicaklik[6] =3;
Dizi - Örnekler Kullanıcının bir aylık sıcaklık değerini klavyeden gireceği ve bu değerlerin ortalamasını, en düşük ve en yüksek sıcaklığı bulan bir kod yazın:
import java.util.*; public class ortalamaSicaklik { public static void main(String [] args) { Scanner klavye = new Scanner(System.in); double [] sicaklik = new double [30]; int indis, gun1, gun2; double toplam,ortalama, enDusuk, enYuksek; toplam = 0.0; for (indis=0; indis <= 29; indis++) { System.out.print (“Gun: “ + (indis+1) + “ sicaklik: “); sicaklik[indis] = klavye.nextDouble(); toplam += sicaklik[indis]; } ortalama = toplam / 30.0; System.out.println (“Kasim ayi ortalamasi = “ + ortalama); enDusuk = sicaklik[0]; gun1 = 0; enYuksek = sicaklik[0]; gun2 = 0; for (indis=1; indis <=29; indis++) { if (enDusuk > sicaklik[indis]) { enDusuk = sicaklik[indis]; gun1 = indis; } if (enBuyuk < sicaklik[indis]) { enBuyuk = sicaklik[indis]; gun2 = indis; } } System.out.println (“En dusuk sicaklik = “ + enDusuk + “ Gun = “ + (gun1+1)); System.out.println (“En yuksek sicaklik = “ + enYuksek + “ Gun = “ + (gun2+1)); } }
Dizi tanımlanması double [] sinavNotu = new double [50]; Dizi elemanlarının veri türü Dizinin adı Dizide kaç eleman var double [] sinavNotu; sinavNotu = new double[50]; sinavNotu[3] = 78.3; Dizinin dördüncü elemanı (3 numaralı indis) = 78.3
length Length ile dizinin büyüklüğünü (eleman sayısını) bulabiliriz. sinavNotu.length dizinin büyüklüğünü verir double[] sinavNotu = new double[50]; System.out.println (“Dizinin uzunlugu: “ + sinavNotu.length ); Dizinin uzunluğu atama yoluyla değiştirilemez: sinavNotu.length = 100; // Yazılamaz, hatalı Dizinin boyutlarının dışına çıkmamaya dikkat edilmeli! sınavNotu[50] = 65.1; //Max indis aşıldı Derleyici hatası olmaz ama program çalışması sırasında Array index out of bounds mesajı alınır (çalışma zamanı hatası) Yukarıdaki sınavNotu dizisinin tanımına göre en son elemanın indisi 49 olur. (0 ile 49 arasında olacak. Toplam 50 eleman.)
Diziye İlk Değer Atama Diziler yaratıldığı sırada ilk değerlerini alabilirler: int [] sicaklik = {17,16,14,15,18,17,16}; Dizinin 7 elemanlı bir dizi olduğunu anlıyoruz. Veya dizi tanımlandıktan sonra tek tek değer ataması yapılabilir: int [] sicaklik = new int [7]; sicaklik[0]=17; sicaklik[1]=16; …; sicaklik[6]=16;
Diziye İlk Değer Atama int veri tipindeki diziler eğer ilk değer almazlarsa otomatik olarak 0’a atanırlar. Fakat programın daha anlaşılır olması için, daha sonra değiştirilmek üzere bütün değerler bir döngü kullanarak 0’a da atanabilir. Kod: int [] sicaklik = new int[365]; int i; for (i=0; i < sicaklik.length; i++) sicaklik[i] = 0;
Örnekler Bir dizi yapın ve bu diziyi başka bir diziye kopyalayın: … int dizi1 = { 7, 4, 8, 1, 4, 1, 4}; float dizi2 = new float[dizi1.length]; //diziyi yazdir //dizi1’i dizi2’ye kopyala for(i=0; i< dizi1.length; i++) dizi2[i] = (float) dizi1[i]; //dizi2 yazdir Örnek 2) Math.random() metodunu kullanarak 500 elemanlı int veri türünde bir dizi yapıp bu dizinin ortalaması, min ve max umunu ekrana basacak programı kodlayınız.
Sınıf ve Metotlarda Dizi Kullanımı Bir sınıf içinde bir değişken tanımlanabildiği gibi bir dizi de tanımlanabilir. (gerçekleştirme değişkeni) Dizilerin tamamı metotlara gönderilebilirler – parametre olarak-, bu durumda bir nesne olarak gönderildikleri için referans ile çağırma tekniğiyle gönderilmiş olurlar. Eğer dizinin bir elemanı metoda gönderilirse ve dizi elemanlarının veri tipi basit ise değer ile çağırma tekniği uygulanır, eğer dizi elemanları nesne ise referans ile çağırma tekniği uygulanır.
Elemanları Ogrenci adında bir sınıf tipinde olan kayit adında bir dizi oluşturun: Ogrenci [] kayit; kayit[i] = new Ogrenci(); // kayit dizisinin her bir elemani Ogrenci sinifinin bir nesnesi
Metoda Giren İndisli Dizi Elemanları Dizinin bir elemanı metoda parametre olarak yollanabilir. ortalama = ortalamaBul (birinciDeger, sicaklik[i]); Bu örnekte sicaklik ve birinciDeger parametrelerinin ortalamaları ortalamaBul metoduyla hesaplanmaktadır. Bu durumda sicaklik[i] metot tanımındaki veri tipinde sıradan bir değişken olarak metoda gönderilmiştir. Eğer metoda gönderilen dizinin veri tipi basit veri tipiyse, metot bu indisli dizi elemanın değerini değiştiremez. Eğer, veri tipi bir nesne ise, referans ile çağırma vasıtasıyla bu indisli elemanın değeri değişebilir.
Metoda Giren Diziler Bir diziyi metoda gönderirken köşeli parantezler kullanılmaz. Gönderilen dizi bir nesne olarak gönderilmiş olur. double [] sicaklik = new double[30]; ortalama = ortalamaBul (sicaklik); Bu durumda ortalamaBul metodu bir diziyi argüman olarak almaktadır ve bir double değeri alan ortalama geri vermektedir. ortalamaBul değerinin tanımı ise aşağıdaki şekilde olabilir. public double ortalamaBul (double[] deger) { int i, toplam = 0; for (i = 0; i < deger.length; i++ ) toplam = toplam + deger[i]; return (toplam/deger.length); }
Diziler de birer nesne gibi düşünüldüğü için diziler için atama “=” ve eşitlik “==” kavramları dizilerde de geçerli değildir. İki dizi için “=” ifadesi kullanıldığında bu iki dizinin referansı (bellekteki gösterimleri eşitlenmiş olur, dolayısıyla iki dizi de aynı diziyi gösteriyor olurlar.) Aynı şekilde “==” gösterimi ancak iki dizi aynı referansa sahip olduğunda doğru olmaktadır. Bunun yerine nesnelerde olduğu gibi bir equals metodu tanımlamak gerekmektedir.
int [] a = new int[3]; int [] b = new int[3]; int i; for (i = 0; i < a.length; i++ ) a[i] = i; b[i] = i; if (b==a) System.out.println (“== kullanarak esittirler.”); else System.out.println (“== kullanarak esit degildirler.”); == kullanarak esit degildirler
== ile esit degil Esit metodu ile esit public class TestEsitlik { public static void main(String[] args) int[] a = new int[3]; int[] b = new int[3]; int i; for (i = 0; i < a.length; i++) a[i] = i; for (i = 0; i < b.length; i++) b[i] = i; if (b == a) System.out.println("== ile esit."); else System.out.println("== ile esit degil."); if (esit(b,a)) System.out.println(“Esit metodu ile esit."); System.out.println(" Esit metodu ile esit degil."); } public static boolean esit(int[] a, int[] b) { boolean denkmi; if (a.length != b.length) denkmi = false; denkmi = true; //gecici olarak true degeri ata int i = 0; while (denkmi && (i < a.length)) { if (a[i] != b[i]) i++; } } return denkmi; } } == ile esit degil Esit metodu ile esit Static bir metod icinden (main) static bir baska metodu (esit) cagirdigimiz icin, ve her ikisi de ayni sinif icinde tanimli oldugu icin sadece adini kullanmamiz yeterli. Nesne olusturup onun uzerinden cagirmamiza gerek yok.
Dizi Döndüren Metotlar public int faktoriyel(int sayi) Javada metotlar bir nesne döndürebilirler. Diziler de birer nesne olarak kabul edildikleri için metotlarda dizi döndürmek mümkündür. Bu tip bir metot aşağıdaki gibi tasarlanır. public veri_tipi[] metot_ismi (parametre listesi) Metodun ulaşılabilirliği public ya da private olabilir. Ayrıca metot static olarak da tanımlanabilir.
Dizi Döndüren Metotlar public static char [] sesliHarfler () { char[] yeniDizi = new char[8]; yeniDizi [0] = ‘a’; yeniDizi [1] = ‘e’; yeniDizi [2] = ‘ı’; yeniDizi [3] = ‘i’; yeniDizi [4] = ‘o’; yeniDizi [5] = ‘ö’; yeniDizi [6] = ‘u’; yeniDizi [7] = ‘ü’; return yeniDizi; }
Dizi Değerlerinin Sıralanması Değerleri küçükten büyüğe veya tersi şekilde sıralamak için. Kabarcık sıralama (Bubble Sort) (n sayıyı küçükten büyüğe sıraya dizmek için bir algoritma) Algoritma için iç içe iki döngü ve bir yineleme sayacı kullanılır. Bu yineleme sayacının bir turunda, dizideki kalan en büyük sayı dizinin sonuna gider. Buna göre ilk yinelemede dizinin en büyük sayısı en sona gider. Bundan sonra artık en son sayıyı denetlemeye gerek yoktur. İkinci yinelemede en büyük ikinci sayısı sondan bir önceki yere gider. Bu şekilde n-1 yinelemede n sayı sıraya dizilmiş olur. Her yinelemede ise denetlenmesi gereken sayı adedi 1 azalır.
Kabarcık Sıralama (Bubble Sort) 12 4 15 7 20 13 4 12 15 7 20 13 4 12 7 15 20 13 4 12 7 15 13 20 4 7 12 15 13 20 4 7 12 13 15 20 Tamamlandı
public class kabarcikSiralama { final static int maksEleman = 2000; public static void main(String[]args) { int n; Scanner klavye = new Scanner(System.in); int[] liste = new int[maksEleman]; //listeyi yarat System.out.print("Liste boyunu giriniz:"); n = klavye.nextInt(); for(int i=0; i<n; i++) liste[i] = (int)Math.round(Math.random()*5)+1; liste = kabarcik(liste,n); System.out.println("Sirali Liste:"); System.out.println(liste[i]); } //------------------------------------------ public static int[] kabarcik(int[] x, int boy) int gecici; for(int k=1; k<boy; k++) for(int i=0; i<boy-k; i++) if(x[i]>x[i+1]) gecici = x[i]; x[i] = x[i+1]; x[i+1] = gecici; return x; }} Static bir metod icinden (main) static bir baska metodu (kabarcik) cagirdigimiz icin, ve her ikisi de ayni sinif icinde tanimli oldugu icin sadece adini kullanmamiz yeterli. Nesne olusturup onun uzerinden cagirmamiza gerek yok.
Dizilerde Veri Türü Olarak Nesne Kullanılması Bir dizinin eleman tipi nesne olabilir. public class Kisi { private String isim; private String ePosta; private String dogumYeri; private double gpa; //---------------------------------------------------- public Kisi(String a, String b, String c, double o) isim=a;ePosta=b;dogumYeri=c;gpa=o; } public Kisi() public void setIsim(String adSoyad) isim=adSoyad; … Kisi [] ogrenci = new Kisi [maksMevcut]; ogrenci[i] = new Kisi(); //nesne kurucu ogrenci[i].setIsim(“Ali Veli”);
Çok Boyutlu Diziler Matris veya çok boyutlu veri gösterimi için kullanılırlar. 2 Boyutlu bir dizi: veri_turu [] [] matris = new veri_turu [4] [4]; Bir elemana ulaşmak için yerini 2 indisi de kullanarak tespit etmek lazım. matris[1][1] = 70; matris[0] [0]= 80; matris[1][0]=67; matris[2][3]=36; 80 65 55 70 67 90 45 73 36 25 16 81 96
Çok Boyutlu Diziler Çok boyutlu diziler aslında her boyut içinde yer alan birer boyutlu dizilerin bileşkesidir. Tüm dizinin uzunluğu (büyüklüğü) her boyuttaki dizilerin uzunluğunun çarpımına eşittir. Örnek: int [][] tablo = new int [10][20]; tablo[3][5] = 23; System.out.println (“Tablo cok boyutlu dizisinin uzunlugu: “ + tablo.length); 10
Ayrıca her boyuttaki dizilere de ayrı ayrı erişebiliriz, bunları da birer boyutlu diziler olarak kullanabiliriz. Örnek: int [][] tablo = new int [3][10] yazmak yerine int [][] tablo; tablo = new int [3][]; tablo[0] = new int [10]; tablo[1] = new int [10]; tablo[2] = new int [10]; yazılabilir ve bu iki ifade de birbirine denktir. Bu şekilde çok boyutlu diziyi oluşturan tek boyutlu dizilerin uzunluklarını da ayrı ayrı kullanmak mümkün olabilir. Buna göre tablo[0].length ifadesi 0. indisteki dizinin uzunluğunu gösterir.
int [][] matris = new int [4][4]; for (sira = 0; sira <4; sira++ ) for (sutun = 0; sutun <4; sutun++ ) matris [sira][sutun] = (int) (Math.random()*5) + 1; { System.out.print (matris[sira][sutun] + “ “); System.out.println (); } Çıktı: 7 4 5 3 6 5 4 1 2 4 5 8 9 6 5 3
Referans : kadioğlu