Tüm programlama dillerinde olduğu gibi Java dilinde de dizi (array) yapısı son derecede önemli bir veri yapısıdır. Dizi yapısını kısaca tanımlarsak:
Dizi, bilgisayar belleğinde aynı isim altında genellikle aynı tipten çok sayıda veriyi bir arada saklayan veri yapısıdır. Aşağıda, x adlı bir dizinin mantıksal görünümü verilmiştir:
4 | 2 | 7 | 22 | 11 | 3 |
0 | 1 | 2 | 3 | 4 | 5 |
Dizinin bir adı ve dizi içerisindeki elemanın dizinin kaçıncı elemanı olduğunu belirten bir indisi (subscript, index) vardır. Örneğin, yukarıdaki x adlı dizi için x ifadesi bu dizinin 3 numaralı elemanını yani 22 değerini göstermektedir. Dizinin indisi Java dilinde daima köşeli parantez ile belirlenir:
Java dilinde bir dizinin ilk elemanının indisi daima 0’dır; son elemanın indisi ise diziye ayrılan yer sayısının 1 eksiğine eşittir. Yukardaki x dizisinin 6 elemanı vardır; ilk elemanının indisi 0 ve son elemanının indisi de 5’tir. Java Programı içinde Dizinin Bildirilmesi Bir Java programı içinde diziyi tanıtmak için, new sözcüğünü kullanarak belirli bir tipten yeni bir nesne tanımlama yolu izlenir. Dizinin tipi, adı ve maksimum eleman sayısı bir bildiri deyimi içinde belirtilir:
Tip DiziAdı[ ] = new Tip [ Eleman Sayısı ];
veya eşdeğeri
Tip [ ] DiziAdı = new Tip [ Eleman Sayısı ];
Örneğin, yukarıdaki x dizisi için,
int [ ] x= new int [6] ;
şeklinde bildirimde bulunulacaktır. x dizisi 6 elemanlıdır ve elemanları int türündedir.
Dizi için ne gereklidir?
Dizi yapısına, aynı türden bir veri grubunu tümüyle bellekte saklı tutmanın gerekli olduğu uygulamalarda ihtiyaç duyarız. Örneğin, verilerin sıralanması, bir veri grubuna ait bazı istatistiksel bilgilerin hesaplanması (standart sapma vb.) gibi uygulamalar bu tür uygulamalardandır.
Örnek: Aşağıda aynı işlemi gerçekleştiren iki farklı Java programı verilmiştir. Her iki program da, bilgisayara girilen 5 adet sayının toplamını bulmaktadır.
Dizi kullanmayan sürüm
import java.util.Scanner;
public class Dizi1{
public static void main(String[] args)
{ Scanner giris = new Scanner(System.in);
int girilenSayi, toplam, i ;
toplam = 0; girilenSayi = 0;
for (i = 1; i <= 5; i++)
{
System.out.print("Bir sayi giriniz: ");
girilenSayi = giris.nextInt();
toplam = toplam + girilenSayi;
}
System.out.println(i-1+ " tane sayi girdiniz.");
System.out.println("Toplami " +toplam+ " ediyor.");
}
}
Bu programın şöyle bir çıktısı olacak:
NOT: Scanner sınıfı bir akıştan (Stream) gelen veriyi bir değişkene atamak için kullanılmıştır. System.in akışı, kullanıcının konsola veri girmesi için kullanılır.
Dizi kullanan sürüm
import java.util.Scanner;
public class Dizi2{
public static void main(String[] args)
{
Scanner giris = new Scanner(System.in);
int sayi[] = new int[6];
int toplam, i; toplam = 0;
for (i = 1; i <= 5; i++)
{
System.out.print("Bir sayi giriniz: ");
sayi[i] = giris.nextInt(); t
oplam = toplam + sayi[i];
}
System.out.println("Girdiniz sayilarin toplami: " + toplam);
System.out.println("Sayi dizisinin ikinci elemani: " + sayi[2]);
}
}
Bu programın çıktısı şöyle olacak:
Örnekte, dizi kullanmayan sürümde, bilgi giriş ortamından girilecek
olan sayılar (sırasıyla 4, 7, 8, 11, 2 sayıları) toplanacak ve sonuç=32 olarak bulunacak ve yazdırılacaktır.
Aslında, ikinci sürümde de aynı veriler girildiği takdirde, sonuçta gene t = 32 şeklinde bu sayıların toplamı yazdırılacaktır.
Bu iki program arasında çok önemli bir fark mevcuttur: dizi kullanmayan sürümde, girilen her sayı, girilenSayi adlı değişkende saklanacak ve her seferinde o andaki girilenSayi değişkeninin değeri o ana kadar olan sayılar toplamını saklayan toplam değişkenine eklenecektir. Her yeni sayı girildiğinde, girilenSayi değişkeninde saklı bulunan bir önceki sayı değeri silinecektir. Bu durumda programın sonunda girilenSayi değişkeninde en son girilen değer olan 2 değeri saklanacaktır
System.out.println(girilenSayi+ " tane sayi girdiniz.");
deyimi ile yazdırılan sayı da bu olacaktır.
Dizi kullanmayan sürümde, örneğin program sonunda ”Girdiğimiz 3. sayı neydi?” diye merak eder ve bunu yazdırmak istersek bunun olanaksız olduğunu görürüz. Oysa ikinci sürümde dizi kullanıldığı için her sayı, sayi dizisinin bir elemanı olarak sonuna kadar bellekte saklanır. Bu noktada program sonunda,
System.out.println("Sayi dizisinin ikinci elemani: " + sayi[2]);
deyimiyle 3. sayıyı yazdırmamız mümkündür.
Dizilere Başlangıç Değeri Atanması
Birçok bilgisayar dilinde olduğu gibi, Java dilinde de dizilere dizinin tanımlanması esnasında başlangıç değeri atanması mümkündür. Örneğin,
intx ={3,-2,1,4,11};
şeklindeki bildiri deyimi ile, x dizisine aşağıdaki gibi değerler atanmıştır: Örnek: Başlangıç Değeri Atanması
public class Dizi3
{
public static void main(String[] args)
{
int [] sayi={2,1,5,3,6};
double toplam = 0; int i;
for(i=0; i<=4; i++)
{
toplam=toplam+sayi[i];
}
System.out.println("Toplam: "+toplam);
}
}
Burada çıktımız şu şekilde gerçekleşecek:
Dizi tanımında diğer bir yöntem
Dizi boyutunu bir değişken olarak tanımladıktan sonra diziyi tanımlarken bu değişkeni kullanmamız da mümkündür. Aşağıdaki komutlarla 5 elemanlı bir dizi tanımlayabiliyor fakat diziye ilk değer ataması yapamıyoruz:
int DIZI_BOYUT=5;
int [] sayi;
sayi=new int[DIZI_BOYUT];
Örnek: Dizi Boyutunun Bir Değişkenle Belirtilmesi
import java.util.Scanner;
public class Dizi4{
public static void main(String[] args)
{
Scanner giris = new Scanner(System.in);
int DIZI_BOYUT = 5; int[] sayi;
sayi = new int[DIZI_BOYUT];
int toplam=0; int i;
for (i = 0; i <= 4; i++) {
System.out.print(i + ". dizi elemanini giriniz: ");
sayi[i] = giris.nextInt(); toplam = toplam + sayi[i];
}
System.out.println("Toplam: " + toplam);
}
}
Programın çıktısı:
Bir fonksiyon parametresi olarak diziler
Fonksiyonlar ve fonksiyon parametreleri konusunda bir fikrimiz olduğuna göre hemen şunu söyleyebiliriz: Bir dizi, bir fonksiyon parametresi olarak kullanılabilir. Çağıran fonksiyon ya da program, dizi türündeki bu parametreye yine dizi türünde olmak üzere bir argüman geçirebilir. Bir dizi, bir fonksiyon parametresi olacaksa; dizinin tipi, adı ve içi boş olan köşeli parantezler fonksiyonun parametre listesinde görünmelidir. Örneğin,
static int topla_dizi(int[] x, int n)
gibi bir fonksiyon başlığında x tam sayı tipinde bir dizidir. n parametresi ise dizinin eleman sayısıdır. Bu fonksiyonu çağıran fonksiyon veya program içinde, a dizisi,
int[ ]a={2,8,3,7,5};
şeklinde tanımlanmışsa, yukardaki topla_dizi adlı fonksiyon,
toplam=topla_dizi(a,5);
şeklinde çağrılabilir.
Örnek: "n" Elemanlı Bir "x" Dizisinin Toplamını Bulan Bir Fonksiyon ve Çağıran Programla Birlikte Kullanılması
public class Dizi5 {
public static void main(String[] args){
int[] a={2,8,3,7,5};
int toplam;
toplam=topla_dizi(a,5);
System.out.println("Toplam: "+toplam);
}
static int topla_dizi(int [] x,int n){
int i, ictoplam;
ictoplam=0;
for(i=0; i<n; i++) {
ictoplam+=x[i];
}
return ictoplam;
}
}
Bu kodun çıktısı: