Java - Arrays

Java - Arrays

Arkadaşlar merhaba,

Bu yazımızda Java'da dizilere (array) göz atacağız.

Array Nedir ?

  • Java’da diziler, belli sayıda ve aynı tipten olan elemanları tutan veri yapılarıdır.
  • Dizilerin elemanları, ilkel ya da referans tipten verileri olabilirler.
  • Başka bir deyişle, bir dizi sıralı bir listedir. Yinelenenler değeler içerebilir.
  • Bir dizi, belirlenen sayıda öğe için alan içeren yığın(stack) üzerindeki bir bellek alanıdır.
  • Uzunlukları sabittir ve bu bilgi dizi oluşturulurken verilmelidir.
  • Dizilerde tanımladığımız tip dizinin içinde tutulacak eleman tipidir.
  • Dizinin uzunluğu 0 ya da pozitif tam sayı olmalıdır.
  • Bir dizi oluşturulduğunda, odalarındaki elemanlar, dizinin tipinin varsayılan değerine sahip olur.
  • boolean için false diğer sayısal primitive tipler için 0'dır.
  • Referans tipler için ise varsayılan değer null'dır.

Dizi Oluşturma

Kısaca açıklamak gerekir ise;

Örneklerde göreceğimiz gibi [] ile bir array oluşturulabiliriz.

Ayrıca numbers1 örneğindeki gibi new int[3] dizinin boyutunu belirleyebiliriz.

Dizi oluşturulurken boyut olarak negatif sayı verilemez.

Dizi elementleri default olarak 0'dan başlar ve dizinin uzunluğunun bir eksiğine kadar (length-1) kadar devam eder.

char[] letters;

int[] numbers1 = new int[3];

int[] numbers2 = new int[] { 42, 55, 99 };

Kısayol => int[] numbers2 = { 42, 55, 82 };
int[] numAnimals;
int [] numAnimals2;
int []numAnimals3;
int numAnimals4[];
int numAnimals5 [];

int[] ids, types;   // int[] türünde iki değişkendir.

Aşağıdaki örnekte java ids1'i bir int array objesi olarak görürken types1 ise bir int primitive tipi olarak görür.

int ids1[], types1;

Reference Variables

Bir dizi bir nesne olduğu için equals()'i çağırabiliriz. Referans eşitliği nedeniyle true değerini döndürür. Dizilerdeki equals() methodu, dizinin elements'lerine bakmaz.

int bir primitive'dir; int[] bir nesnedir.

String[] bugs = { "cricket", "beetle", "ladybug" };
String[] alias = bugs;

System.out.println(bugs.equals(alias)); // true
System.out.println(types1 = 1);

Aşağıdaki örnekte L bunun bir dizi olduğu anlamına gelir, Java.lang.String referans türüdür ve 49097b5d hash koddur.Bu bir referans olduğundan, her çalıştırdığınızda farklı sayılar ve harfler alacaksınız.

Dizi, String nesneleri için alan ayırmaz. Bunun yerine, nesnelerin gerçekten depolandığı yere bir referans için alan ayırır.

System.out.println(bugs.toString());

// [Ljava.lang.String;@49097b5d
String[] mammals = { "monkey", "chimp", "
System.out.println(mammals.length); // 3 

Metot olmadığı için length'den sonra parantez olmadığına dikkat edin.


System.out.println(mammals[0]);  // monkey
System.out.println(mammals[1]);  // chimp
System.out.println(mammals[2]);  // donkey
String[] dogs = new String[
System.out.println(dogs.length);

Cevap 6'dır. Dizinin altı elemanının tamamı boş olmasına rağmen, hala altı tane vardır. uzunluk dizide ne olduğunu dikkate almaz; sadece kaç tane slot tahsis edildiğini dikkate alır.

String names[] = new String[2];

Parantezleri olduğu için bir dizidir. Bildirimde belirtilen tür olduğundan, String türünde bir dizidir. Uzunluğu 2 olduğu için iki öğesi vardır. Bu iki yuvanın her biri şu anda boştur ancak bir String nesnesine işaret etme potansiyeline sahiptir.

String[] strings = {"stringValue"};// String türünde bir dizi oluşturur
Object[] objects = strings; // cast gerektirmez object stringden daha geniş bir türdür.
String[] againString = (String[]) objects; //  daha spesifik bir türe geçeceğimiz için bir cast gerekiyor.
againString[0] = new StringBuilder(); // Does Not Compile

// Satır derlenmiyor çünkü bir String[] yalnızca String nesnelerine izin veriyor ve StringBuilder bir String değil.

Son satırda bir StringBuilder nesnesi bir Object[] içine girebilir. Sorun şu ki, aslında bir Object[] yok. Bir Object[] değişkeninden referans olunan bir String[] var.

Çalışma zamanında (runtime) kod bir ArrayStoreExceptionoluşturur.

objects[0] = new StringBuilder();

Bir diziye veri eklerken yada okurken döngüler kullanmak çok yaygındır.

int[] numbers = new int[10];
    for (int i = 0; i < numbers.length; i++)
            numbers[i] = i + 5; //
System.out.println("numbers " + numbers);

Sıralama İşlemleri

Java, bir sıralama methodu veya daha doğrusu bir dizi sıralama methodu sağlayarak bir diziyi sıralamayı kolaylaştırır.Hemen hemen her diziyi Arrays.sort() öğesine iletebilirsiniz.

Arrays, Java tarafından sağlanan ve içe aktarma(import) gerektiren ilk sınıftır.Bunu kullanmak için sınıfınızda aşağıdaki iki ifadeden birine sahip olmanız gerekir.

java.util.Arrays;

import java.util.*;

int[] numbers = { 6, 8, 2 };
Arrays.sort(numbers);

for (int i = 0; i < numbers.length; i++)
    System.out.println("sorting :" + numbers[i] + " ");

Sayılar harflerden önce ve büyük harfler küçük harflerden önce sıralanır.

index kullanmadığımız için geleneksel for döngüsü kullanmadık.

String[] strings = { "10", "9", "100" , "Umut" };
Arrays.sort(strings);
for (String string : strings)
    System.out.println("sorting :" + string + " ");

// 10 100 9 Umut

Arama İşlemleri

int[] numbers1 = { 2, 4, 6, 8 }; // Sıralanmış bir dizi

System.out.println(Arrays.binarySearch(numbers1, 2)); //  0
System.out.println(Arrays.binarySearch(numbers1, 4)); // 1
System.out.println(Arrays.binarySearch(numbers1, 1)); // -1 

// 1 listede olmamasına rağmen, arama, sıralama düzenini korumak için 0 öğesine eklenmesi gerektiğini belirleyebilir.
// 0 zaten dizi index'leri için bir anlam ifade ettiğinden Java'nın bize -1'in yanıtını vermesi için 1'i çıkarması gerekir.

// Bu durumda -1 arraydeki 0 konumuna denk gelir.

System.out.println(Arrays.binarySearch(numbers1, 3)); // -2
System.out.println(Arrays.binarySearch(numbers1, 9)); // -5
int[] numbers2 = new int[] {3,2,1}; // SIRALI DEĞİL

System.out.println("numbers2 :" + Arrays.binarySearch(numbers2,2)); // 1

System.out.println("numbers2 :" + Arrays.binarySearch(numbers2,3)); // -4

Karşılaştırma (Comparing)

Java ayrıca hangisinin "daha küçük" olduğunu belirlemek için iki diziyi karşılaştırmak için methodlar sağlar.Bi tanesi compare'dir.

  • Negatif bir sayı, ilk index'in ikinciden daha küçük olduğu anlamına gelir.

  • Sıfır, index'lerin eşit olduğu anlamına gelir.

  • Pozitif bir sayı, ilk index'in ikinciden daha büyük olduğu anlamına gelir.

System.out.println(Arrays.compare(new int[] { 1 }, new int[] { 2 }));
System.out.println(Arrays.compare(new int[] { 7 }, new int[] { 5 }));

// -1
// 1
  • Her iki dizi de aynı uzunluktaysa ve her noktada aynı sırayla aynı değerlere sahipse, sıfır döndürür.
System.out.println("Compare Zero : " + Arrays.compare(new int[] {1,2} , new int[] {1,2})); 
//0
  • Tüm öğeler aynıysa ancak ikinci dizinin sonunda fazladan öğeler varsa, negatif bir sayı döndürür.
System.out.println("Compare Negative : " + Arrays.compare(new String[] {"a"} , new String[] {"a,a"})); 
// -2
  • Tüm öğeler aynıysa ancak ilk dizinin sonunda fazladan öğeler varsa, pozitif bir sayı döndürür.
System.out.println("Compare Positive : " + Arrays.compare(new int[] {1,2} , new int[] {1})); 
// 1
  • İlk dizide farklılık gösteren ilk öğe daha büyükse, pozitif bir sayı döndürür.Büyük harf küçük harften daha küçüktür.
System.out.println("Compare Positive : " + Arrays.compare(new String[] {"a"} , new String[] {"A"})); 
// 32
  • null, diğer tüm değerlerden daha küçüktür. Sayılar için normal sayısal sıra geçerlidir. Stringler için, biri diğerinin önekiyse daha küçüktür.
System.out.println("Compare Null : " + Arrays.compare(new String[] {"a"} , new String[] {null})); 
//  1

Son olarak, türler farklı olduğu için bu kod derlenmiyor. İki diziyi karşılaştırırken, aynı dizi türünde olmaları gerekir.

System.out.println(Arrays.compare(new int[] { 1 }, new String[] { "a" }));

mismatch()

Diziler eşitse, mismatch() -1 değerini döndürür. Aksi takdirde, farklı oldukları ilk index'i döndürür.

System.out.println(Arrays.mismatch(new int[] { 1 }, new int[] { 1 }));
System.out.println(Arrays.mismatch(new String[] { "a" }, new String[] { "A" }));
System.out.println(Arrays.mismatch(new int[] { 1, 2 }, new int[] { 1 }));
System.out.println(Arrays.mismatch(new int[] { 3, 2 }, new int[] { 1 }));

// -1
// 0
// 1
// 0

Diziler aynı olduğunda;

equals() true;

compare() 0;

mismatch() -1

döndürür.

Diziler farklı olduğunda;

equals() false;

compare() pozitif veya negatif number;

mismatch() 0 veya pozitif index

döndürür.

Çok Boyutlu Diziler (MULTIDIMENSIONAL ARRAYS)

Çok boyutlu diziler dizi içinde dizi olarak ifade edilirler.

Çok boyutlu diziler ilk dizinin her bir odasına bir başka dizi konularak elde edilirler.

Tanımlarken ilk dizinin boyutu verilmelidir.

int[][] vars1; // 2D
int vars2[][]; // 2D
int[] vars3[]; // 2D
int[] vars4[], space[][]; // a 2D AND a 3D array
String[][] rectangle = new String[3][2];
rectangle[0][1] = "example";
int[][] differentSizes = { { 1, 4 }, { 3 }, { 9, 8, 7 } };
int[] different1 = differentSizes[0]; // 1,4

System.out.println("differentSizes " + differentSizes[0][1]);

// differentSizes 4

Burada iki döngümüz var. İlki indeks i'yi kullanır ve example için ilk alt diziden geçer. İkincisi, farklı bir döngü değişkeni j kullanır.

Döngülerin karışmaması için bunların farklı değişken isimleri olması önemlidir. İç döngü, ikinci dizide kaç öğe olduğuna bakar. İç döngü elemanı yazdırır ve okunabilirlik için bir boşluk bırakır. İç döngü tamamlandığında, dış döngü yeni bir satıra geçer ve bir sonraki eleman için işlemi tekrarlar.

    int[][] example = new int[2][2];

    for (int i = 0; i < example.length; i++) {
            for (int j = 0; j < example[i].length; j++) {
                System.out.print(example[i][j] + " ");
                  System.out.println();
            }
    }